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

게임개발 중급(35) - 3D 밤송이 게임 만들기(3)

by jyppro 2023. 5. 26.

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

저번엔 터레인에 다양한 텍스쳐 적용법과 나무를 생성해 맵을 꾸미고 게임을 만들기 위한 오브젝트 배치 및 설계까지 하였습니다. 이번엔 게임을 만들기 위해 필요한 스크립트를 작성해보는 시간을 갖도록 하겠습니다.

 

BamsongiGenerator

이전에 밤송이 오브젝트를 통해 밤송이 프리팹을 만들었습니다. 우선 이 프리팹을 사용해서 밤송이 오브젝트를 맵에 생성하는 기능을 만들어야 합니다.

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

public class BamsongiGenerator : MonoBehaviour
{
    public GameObject bamsongiPrefab;

    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);
        }
    }
}

해당 코드는 밤송이 프리팹을 생성하는 코드입니다. GetMouseButtonDown()에 숫자 0은 좌클릭을 뜻하며, 좌클릭을 하면, Instantiate를 통해 프리팹을 생성하는데, Ray라는 것을 사용합니다. 이것은 우리가 흔히 알고있는 레이저라고 생각하시면 편합니다. 마우스가 가리키는 한방향을 향해 일직선으로 쭉 뻗어있는 레이저를 통해서 값을 받아오고, 해당  좌표 값을 벡터값으로 받아옵니다. 그리고 그 값을 사용하여 추후에 작성할 밤송이 컨트롤러의 Shoot함수를 실행시킵니다. 빈오브젝트를 생성하여 스크립트를 넣고, 프리팹을 연결해주어야 합니다. 이것을 아울렛 접속이라 부릅니다. 다음부터는 아웃렛 접속이라고 표현하겠습니다.

 

BamsongiController

이번에는 밤송이의 대한 조작을 다루는 컨트롤러 코드입니다.

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


public class BamsongiController : MonoBehaviour
{
	GameObject Generator;
	public void Shoot(Vector3 dir)
	{
		GetComponent<Rigidbody>().AddForce(dir);
	}

	// Use this for initialization
	void Start ()
	{
		//Shoot(new Vector3(0, 200, 2000));
		this.Generator = GameObject.Find("BamsongiGenerator");
	}

	void OnCollisionEnter(Collision other)
	{
		GetComponent<Rigidbody>().isKinematic = true;
	}
}

해당 코드에서는 Shoot()을 통해 밤송이를 던질 수 있습니다. Shoot()은 리지드바디에 AddForce()를 하여 힘을 가하는 단순한 방식입니다. 그런데, Start()함수를 보시면 Shoot()이 주석처리가 되어있는 것을 볼 수 있습니다. 사실 레이를 사용하지 않고 저렇게 고정 값으로 설정하여 던질 수도 있습니다. 하지만 저렇게 던지면 플레이어가 던지고 싶은곳으로 던질 수가 없습니다. 그래서 마우스 포인터로 값을 받아오는 것입니다. OnCollisionEnter()는 과녘에 맞추었을 때, 밤송이가 고정되도록 해주는 것입니다.

 

이렇게만 작성해 주어도 벌써 기본적인 기능은 완성이 되었습니다. 플레이어가 밤송이를 던지면 바라보는 방향으로 날아가고, 과녘에 맞추면 박힙니다. 그리고 다시 밤송이가 재생성됩니다.

 

이제 저희는 디테일을 좀 더 살려 보겠습니다.

 

점수UI 추가

과녘 맞추기 게임인데 점수가 없으면 플레이 하는 사람도 재미를 느끼지 못할 것입니다. 이전에 계속 해왔던 것처럼 기본적인 점수UI를 추가해 보겠습니다.

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

public class BamsongiGenerator : MonoBehaviour
{
    public GameObject bamsongiPrefab;
    GameObject ST;
    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()
    {
        score += 10;
		this.ST.GetComponent<Text>().text = "점수 : " + score.ToString() + "점";
    }
}

위에서 만든 제너레이터 코드에 UI에 대한 내용이 추가되었습니다. 점수UI 생성에 관련한 부분은 더이상 언급하지 않겠습니다. 게임오브젝트 선언하고 Find로 찾아 넣어준 뒤에 Text를 score값을 넣어 바꿔주는 동작입니다.

 

if (other.gameObject.tag == "target") //target과 충돌하는 경우 점수 상승
        {
			this.Generator.GetComponent<BamsongiGenerator>().ScorePlus();
        }

컨트롤러 코드에도 if문 하나를 추가해 줍니다.

이렇게 하면 간단하게 점수를 판단할 수 있습니다. 태그를 사용하여 구분하므로, 당연히 타겟 오브젝트를 target 태그를 만들어 지정해 주어야 합니다.

 

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

총 10번 밤송이를 던져 6번은 못맞춘 상태로 바닥에 떨구었고, 4번은 맞추었습니다. 점수는 40점이 되고, 맞춘 밤송이는 타겟에 붙어있습니다.

 

<NEXT>

여태 많은 내용을 다룬만큼, 이젠 익숙해져서 간단한 게임을 만드는 프로젝트는 금방 만들어집니다. 오늘은 제너레이터와 컨트롤러 코드를 작성하여 프리팹 밤송이를 생성하고, 던지며, UI를 통해 점수를 표시하는 것을 했습니다. 다음에는 재밌는 게임을 만들기 위한 디테일에 대해 조금 더 알아보도록 하겠습니다. 감사합니다.