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

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

by jyppro 2023. 5. 28.

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

이전에는 파티클을 생성하는 방법과 설정에 대해서 알아보았습니다. 오늘은 밤송이가 과녘에 닿지 않았을 때에는 사라지게 만들고, 과녘에 위치에 따라 점수를 다르게 획득하는 것에 대해서 이야기 해보겠습니다.

 

빗나간 오브젝트 처리

과녘을 맞춘 오브젝트들은 그 자리에 그대로 남아있지만, 맞추지 못한 오브젝트는 없어지도록 할 것입니다. 방법은 아주 간단합니다. 우리가 과녘에 닿았을 때를 처리한 것처럼 태그를 설정하여 바닥에 닿으면 없어지도록 만들어주면 됩니다.

else if((collision.gameObject.tag == "terrain")) //바닥과 충돌하는 경우 삭제
        {
            Destroy(gameObject);
        }

밤송이 컨트롤러 코드에 과녘처리를 해놓은 if문에 해당 코드를 추가해주고 저희가 생성한 맵에 terrain 태그를 설정해주면 이제 바닥에 떨어지는 밤송이들은 없어지게 됩니다.

 

과녘의 명중 위치별 점수 처리

이번에는 과녘 오브젝트의 위치에 따라서 점수를 다르게 획득하도록 하는 코드를 작성해 볼 것입니다. 점수를 다르게 설정하는 방법은 직접 위치를 정해놓고 설정하는 것이 있지만, 해당 방법은 저희가 만든 3D 게임에서 사용하기엔 너무 쓸데없이 복잡해지고, 문제가 발생할 가능성이 높아집니다. 그렇기에 저희는 다른방법을 사용할 것입니다.

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


    }
}

해당 스크립트는 BamsongiController 입니다. 새로운 빈 오브젝트 Distance를 추가한 뒤에, Find로 연결해줍니다.

OnCollisonEnter() 안에 p1과 p2로 밤송이와 Distance의 위치값을 저장하고, 두 벡터값의 차이를 d에 저장합니다.

int형 n에 올림 계산을 한 값을 저장하여 점수값으로 치환합니다.

 

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

BamsongiGenerator에 있는 ScorePlus()에 인수로 n을 넘겨주고, 점수를 계산합니다. 그리고 UI에 표시해줍니다.

 

이렇게하면 생성한 빈 오브젝트 Distance와 밤송이의 거리를 계산하여 점수를 10 ~ 1까지 산출하여 적용시킬 수 있는데, 이렇게 할 수 있는 이유는 저희가 처음 target의 Collider를 배치할 때, 빈 오브젝트가 생성되는 원점위치에 만들었기 때문에 딱 맞게 떨어지는 것입니다. 그 말은 결국 만든 타겟의 정중앙과 같은 위치에 빈 오브젝트를 배치하여 사용하면 다른 곳에서도 충분히 활용할 수 있다는 것입니다. 한번 플레이 해보겠습니다.

 

과녘-점수
과녘 위치별 점수측정

가운데를 맞춰 10점을 얻고 가장자리를 맞춰 1점을 획득한 모습입니다. 이렇게 중앙을 기준으로 10~1점을 맞춘위치에 따라 획득할 수 있게 되었습니다.

 

<NEXT>

오늘은 바닥에 떨어지는 빗나간 밤송이가 없어지도록 하는 동작과 밤송이를 던져 맞춘 과녘판에 위치에 따른 점수를 설정하는 방법에 대해 알아보았습니다. 이제 밤송이 게임은 마무리 짓고, 다음에는 총정리로 찾아뵙겠습니다. 감사합니다.