본문 바로가기
게임 프로그래밍/게임개발 중급

게임개발 중급(38) - 3D 밤송이 게임 만들기(총정리)

by jyppro 2023. 5. 29.

3D 밤송이 게임 만들기(총정리)

저번에 과녘에 맞추지 못한 밤송이를 없애는 작업과 과녘별 점수를 따로 부여하는 작업까지 완료하고 밤송이 게임 만들기를 끝내게 되었습니다. 오늘은 여태 했던 내용을 총정리하는 시간을 가지겠습니다.

 

하이어라키 창

하이어라키-창
하이어라키 창

3D 게임의 기본요소인 메인카메라, 디렉셔널 라이트가 있고, 맵을 구성하는 터레인, 게임의 요소인 타겟 그리고 밤송이를 생성하는 밤송이 제너레이터, UI를 작성하는 캔버스와 함께 자동으로 추가되는 이벤트 시스템, 마지막으로 과녘 위치별 점수측정에 사용되는 디스턴스(빈 오브젝트)가 있습니다.

 

사용된 오브젝트

 

사용된-오브젝트
오브젝트들

사용된 오브젝트는 많지 않습니다. 밤송이와 타겟이 있는데, 밤송이는 프리팹화 시켜주었습니다. 그리고 터레인을 꾸미는 데 사용된 레이어 두개가 있습니다.

 

사용된 스크립트

 

사용된-스크립트
사용된 스크립트

스크립트도 두개밖에 작성하지 않았습니다. 각각 밤송이 컨트롤러와 밤송이 제너레이터 입니다. 이제 스크립트를 살펴보겠습니다.

 

BamsongiController

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BamsongiController : MonoBehaviour
{
    public GameObject BamGenerator;
    public GameObject Distance;

    public void Shoot(Vector3 dir) //인자로 3차원 벡터가 입력되고
    {
        GetComponent<Rigidbody>().AddForce(dir); // 들어온 입력벡터 만큼 오브젝트에 힘이 가해진다.
    }

    
    // Start is called before the first frame update
    void Start()
    {
        this.BamGenerator = GameObject.Find("BamsongiGenerator");
        this.Distance = GameObject.Find("distance");
    }

    public void OnCollisionEnter(Collision collision) //다른 물체와 충돌하는 순간
    {
        GetComponent<Rigidbody>().isKinematic = true; //중력의 영향을 무시
        GetComponent<ParticleSystem>().Play(); // particle효과를 실행시킨다.

        Vector2 p1 = this.transform.position;
        Vector2 p2 = this.Distance.transform.position;
        float d = (p1 - p2).magnitude; // 벡터의 길이 리턴
        int n = Mathf.CeilToInt(10 - d * 5);

        if (collision.gameObject.tag == "target") //target과 충돌하는 경우 점수 상승
        {
            BamGenerator.GetComponent<BamsongiGenerator>().ScorePlus(n);
        }
        else if((collision.gameObject.tag == "terrain")) //바닥과 충돌하는 경우 삭제
        {
            Destroy(gameObject);
        }


    }
}

밤송이 컨트롤러에서는 제너레이터와 디스턴스를 연결하고, 밤송이를 던지는 Shoot()함수가 작성되어 있습니다. OnCollisionEnter()로 충돌을 판정하고, 충돌하면 위치를 고정시키며 파티클을 실행시킵니다. 밤송이와 Distance간의 거리를 구해 차이를 계산하여 벡터값을 구하고, 계산된 값을 정수형으로 소수점 올림하여 n에 저장합니다.

타겟에 충돌하였을 경우에 밤송이 제너레이터에 있는 ScorePlus()에 계산된 n값으로 함수를 실행합니다.

터레인에 충돌하였을 경우, 밤송이 오브젝트가 삭제됩니다.

 

BamsongiGenerator

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class BamsongiGenerator : MonoBehaviour
{
    public GameObject bamsongiPrefab;
    GameObject ST;
    public int score = 0;

    void Start()
    {
        this.ST = GameObject.Find("ScoreText");
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            GameObject bamsongi = Instantiate(bamsongiPrefab);

            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            Vector3 worldDir = ray.direction;
            bamsongi.GetComponent<BamsongiController>().Shoot(worldDir.normalized * 2000);
        }
    }

    public void ScorePlus(int n)
    {
        score += n;
        this.ST.GetComponent<Text>().text = "점수 : " + score + " 점";
    }
}

밤송이 프리팹을 사용하여 밤송이를 생성하는 제너레이터 스크립트입니다. 점수 UI를 연결하여 계산된 점수를 표시해줍니다. 마우스 좌클릭을 통해 밤송이를 생성하고, 마우스 포인터 값을 월드좌표로 계산하여 해당 위치로 밤송이를 던질 수 있도록 Shoot()함수를 실행시켜줍니다. ScorePlus() 함수로 점수를 계산하고 UI에 띄워줍니다.

 

게임플레이

게임을 시작하면, 고정된 위치에 타겟과 플레이어가 있고, 마우스 좌클릭을 통해 밤송이를 던질 수 있습니다. 던지고 난 후 밤송이는 다시 생성되고 마우스 위치에 따라 밤송이를 던지는 위치가 달라집니다. 타겟에 맞추면 맞춘 위치에 따라 점수를 다르게 획득하고, 가운데에 가까워질수록 높은 점수를 얻을 수 있습니다. 가장 높은 점수는 10점입니다. 바닥에 떨어지면 점수는 얻지 못하고, 밤송이는 사라집니다.

 

게임플레이-화면
게임플레이 화면

계속해서 밤송이를 던지며 게임을 플레이하고 있는 사진이다.

 

<NEXT>

이번엔 3D 밤송이 게임 만들기를 마무리하면서 총정리를 해보았습니다. 이걸 보시는 분들은 흥미가 있으시다면 이 게임을 더 재밌고 편리하게 디벨롭 해보는 것도 게임 개발능력을 성장시키는 데 도움이 될 것입니다. 예를 들면 던질 수 있는 밤송이 개수에 제한을 두고, 이전에 다뤘던 3D게임 예제처럼 스테이지를 만들 수도 있고, 바닥에 떨어지면 감점이 되고 일정 점수에 도달하지 못하면 게임오버 되도록 만들수도 있습니다. 다양한 방식으로 본인이 원하는 게임의 형식으로 커스터마이징 해보길 추천드립니다. 다음에는 밤송이게임을 저만의 방식으로 커스터마이징 해서 새로운 게임으로 만들어 보겠습니다. 감사합니다.