유니티(Unity) 프로그래밍

Unity3D 추격2

게임첫걸음 2024. 9. 18. 16:10

 이전 글에서 언급한 대로 랜덤한 위치에 타겟을 지정한 시간마다 이동시키고 그걸 추격하는 오브젝트를 구현해 보겠습니다. 우선 타겟 오브젝트를 생성하고 필요한 기능을 나열해 보겠습니다.

 

Target.cs

  • 랜덤을 적용할 범위 변수 선언
  • 위치 변경 쿨타임 변수 선언
  • 위치 바뀌고 시간 경과 변수 선언
  • 두 시간 변수 간 상호작용
  • 타겟 오브젝트 랜덤한 위치로 이동

위를 참고해서 코드를 짜보겠습니다.

using UnityEngine;

public class Target : MonoBehaviour
{
    private float range = 10f;  	//바뀌는 위치 범위 변수
    private float resetTime = 2f;	//위치 변경 쿨타임 변수
    private float duration = 0f;  	//위치 바뀌고 타이머 변수

    //Awake는 변수 초기화
    private void Start()	//Update()함수 호출 전에 실행
    {
        duration = resetTime;	//RandomTarget()이 실행 전에 쿨타임 다 찼다는 것을 실행
    }
}

 우선 변수 3개를 선언해 줬습니다. 그리고 여기서 Awake() 함수는 패스되었습니다. 사용하지 않기 때문인데 이는 유니티 생명주기 (Life Cycle)의 개념이 들어갑니다.

 

유니티(Unity) Component제어 (tistory.com)

 

유니티(Unity) Component제어

유니티는 C# 언어를 사용하는 대표적인 게임 엔진 중 하나입니다. 위의 사진은 유니티의 생명주기로 호출되는 순서라고 생각하시면 됩니다.  오늘은 유니티의 기초적인 기능인 이동, 충돌, 물리

hwangameinformation.tistory.com

이전에 적은 글에선 스크립트에서 특정 함수 호출, 실행되는 순서 정도만 설명했는데, 유니티에서 직접 제공한 자료를 링크해 두겠습니다. 

 

이벤트 함수의 실행 순서 - Unity 매뉴얼 (unity3d.com)

 

이벤트 함수의 실행 순서 - Unity 매뉴얼

Unity 스크립트를 실행하면 사전에 지정한 순서대로 여러 개의 이벤트 함수가 실행됩니다. 이 페이지에서는 이러한 이벤트 함수를 소개하고 실행 시퀀스에 어떻게 포함되는지 설명합니다.

docs.unity3d.com

사용하지 않은 이유는 스크립트 실행 시 딱 한 번만 발동하는 Awake() 함수는 이번엔 필요 없기 때문입니다. 이제 랜덤 타겟 오브젝트의 랜덤 위치 이동 기능인 RandomTarget() 메서드를 확인해 보겠습니다.

 

private void Start()
{
    duration = resetTime;
}

private void Update()
{
    RandomTarget();
}

private void RandomTarget()
{
    duration -= Time.deltaTime; //60번 빼지면 1초
    if (duration <= 0f)
    {
         //x축, z축 -10 ~ 10 범위 랜덤으로 위치 변경할거고
         transform.position = new Vector3(Random.Range(range, -range), 0f, Random.Range(range, -range)); //y축은 적용 X
         //2초마다.
         duration = resetTime;
    }
}

 여기서 자세히 다룰 코드는 duration -= Time.deltaTime; 입니다.

  • duration -= Time.deltaTime; : Time.deltaTime은 프레임 레이트(프레임 최대출력) 상관없이 동기화시켜 주는 키워드로 duration의 값을 일정한 간격으로 감소시키라는 뜻
  • if (duration <= 0f) { } : 감소되다가 0 또는 그 보다 작아졌을 때 조건문을 호출
  • transform.postiion = new Vector3(Random.Range(range, -range), 0f, Random.Range(range, -range)); : 타겟 오브젝트의 위치값을 new Vector3로 동적할당하여 랜덤 범위 ( x, y, z ); 로 이동시켜라. 여기서 y는 0f이니 y좌표계는 0의 위치에 고정되고 x와 z의 좌표가 10 ~ -10 (range, -range)의 위치로 순간이동하라는 뜻
  • duration = resetTime; : duration의 값을 resetTime값인 2와 같도록 하라는 뜻

종합하면 랜덤 위치에 오브젝트를 순간이동 후, 2초 타이머가 지나면 다시 발동하여 순간이동시키라는 메서드가 됩니다.

 

이제 이전 글에서 다뤘던 코드를 재정리하며 쫓아갈 오브젝트에 대한 스크립트를 만들어보겠습니다.

//Chaser.cs Script
using UnityEngine;

public class Chaser : MonoBehaviour
{
    [SerializeField] private GameObject targetGo = null;
    public Transform targetTr = null;
    [SerializeField] private float moveSpeed = 10f; 
}

private void Awake()
{
    targetTr = targetGo.GetComponent<Transform>();
    targetTr = targetGo.transform;  
    targetGo = targetTr.gameObject;
}

private void Update() 
{
    ChaseToTarget();  
}

private void ChaseToTarget()
{
    Vector3 targetPos = targetTr.position; 
    Vector3 myPos = transform.position;     
    Vector3 dir = targetPos - myPos;        

    dir.Normalize();    
    Vector3 dirToNormal = dir.normalized;  

    transform.position = transform.position + (dir * moveSpeed * Time.deltaTime);  
}

 

Chaser는 쫓아오는 오브젝트에서 다룰 스크립트로 전역변수로 선언한 targetGo, targetTr 2가지 모두 Inspector창을 통해 위의 Target 오브젝트가 들어갈 겁니다. 이제 재생하면 Target 오브젝트는 2초마다 x, z의 -10~10까지의 범위 랜덤한 위치에 순간이동할 것이고 Chaser는 Target위치로 쫓아가는 것을 반복하게 될 것입니다.

 

'유니티(Unity) 프로그래밍' 카테고리의 다른 글

Unity 충돌감지  (1) 2024.09.20
유니티3D 아날로그 시계  (0) 2024.09.19
Unity3D 추격  (1) 2024.09.12
Unity3D에 유용한 기능들 (1)  (2) 2024.09.04
Unity3D에서의 상속  (1) 2024.09.04