보행자 앞에는 다음과 같이 트리거가 하나 있습니다.
트리거의 tag는 총 GoWalk, Go, Stop 세 가지를 사용합니다. 순서대로 걷기, 뛰기, 멈추기 입니다.
차량이 진입 트리거를 밟기 전까지 보행자 트리거의 tag는 Stop이므로 애니메이션은 Idle상태이고, 이동하지 않습니다.
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Stop"))
{
animator.SetBool("IsRun", false);
animator.SetBool("IsGreen", false);
speed = 0f;
}
}
차량이 진입 트리거를 밟으면 보행자가 목적지로 이동하기 시작합니다.
진입 트리거의 tag는 SideWalk라고 지정해두었고, 차량에 들어있는 스트립트에서 OnTriggerEnter를 통해 판단합니다.
void OnTriggerEnter(Collider other)
{
/* ... */
else if (other.CompareTag("SideWalk"))
{
// 보행자 레이어 tag 변경
}
}
차량이 트리거를 밟으면 보행자 트리거의 tag가 GoWalk로 바뀝니다.
보행자 안에 들어있는 스크립트에서 OnTriggerEnter를 통해 판단합니다.
void OnTriggerStay(Collider other)
{
if (other.CompareTag("Go"))
{
animator.SetBool("IsGreen", true);
animator.SetBool("IsRun", true);
isWalk = false;
isRun = true;
speed = 3.5f;
}
else if (other.CompareTag("GoWalk"))
{
animator.SetBool("IsGreen", true);
animator.SetBool("IsRun", false);
isWalk = true;
isRun = false;
speed = 0.9f;
}
}
보행자 스크립트의 update 문에서 isRun 또는 isWalk가 true이면 보행자가 MoveTowards를 통해 목적지로 향하게 합니다.
void Update()
{
CompareDistance();
if (isRun || isWalk)
{
transform.position = Vector3.MoveTowards(transform.position, Destination.transform.position, Time.deltaTime * speed);
}
}
목적지는 빈 오브젝트를 배치하여 사용하면 됩니다.
(차량이 해당 구간을 빠르게 지나가게 됩니다. 보행자가 걷고 있다는 것을 보여주기 위한 장치이므로 보행자-목적지까지의 거리가 멀지 않습니다.)
CompareDistance()는 Vector3.Distance를 이용하여 목적지와 보행자의 거리를 구하여, 이 거리가 1 이하이면 보행자가 목적지에 도달했다고 판단하여 Destroy를 통해 보행자를 파괴합니다.
728x90