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