3. 적 캐릭터가 플레이어를 추적
추적기능이 있는 컴포넌트는 3D에서만 쓸 수 있는 듯 하고?
열심히 서칭하고 실험해보다가 성공했다. 예상외로 간단한 것이었다 ㅠㅠ
MoveTowards() 함수를 사용하면 된다!
* MoveTowards(시작점, 도착점, 속도);
목표위치를 향해 주어진 거리만큼 이동시키는 함수
우선, 트랜스폼 데이터타입으로 적위치,플레이어위치를 담을 변수를 선언한다.
start함수에서 적과 플레이어의 트랜스폼 컴포넌트를 담아주고
MoveTowardsPlayer함수를 따로 만들어 그 안에 MoveTowards를 작성해 update함수에서 반복실행되도록 해주었다
public float moveSpeed = 0.5f;
private Transform enemyTr; //적 위치변수
private Transform targetTr; //플레이어 위치변수
void Start(){
enemyTr = this.gameObject.GetComponent<Transform>();
targetTr = GameObject.FindWithTag("player").GetComponent<Transform>();
void MoveTowardsPlayer(){
transform.position = Vector2.MoveTowards (enemyTr.position, targerTr.position, moveSpeed*Time.deltaTime);
}
void Update () {
MoveTowardsPlayer();
}
++)
이렇게 하니 플레이어가 죽었을때 (적과 충돌하여 오브젝트가 파괴됐을 때) 에러가 엄청나게 난다.
플레이어가 사라졌으니, 적 스크립트에서 플레이어 위치를 찾지못해 에러를 내는 것이었다.
플레이어 스크립트에서 상태배열을 추가해주고
public enum PlayerState
{
arrive,die
}
기본값을 arrive로 해주었다.
public PlayerState playerState = PlayerState.arrive;
그 후, OnTriggerEnter2D(Collider2D col)함수에서
태그가 Enemy인 오브젝트와 충돌할시 상태배열값이 die가 되도록 해주고
playerState = PlayerState.die;
오브젝트가 파괴되는것이 아닌 비활성화 되는것으로 해었다
gameobject.SetAchive(false);
Player스크립트를 인스턴스화해서 다른 스크립트에서도 접근가능하도록 해주었다.
다음, Enemy스크립트로 넘어가서
targerTr에 플레이어 트랜스폼 컴포넌트를 넣는것, 또 MoveTowardsPlayer()함수에 if문을 추가하여 플레이어 상태배열이 arrive상태일 경우에만 실행되도록 해주었다.
아래 if문을 추가해주면 된다.
if (Player.instance.playerState == Player.PlayerState.arrive)