Study

3. 적 캐릭터가 플레이어를 추적

YujinK 2016. 4. 11. 15:26
오늘도 열심히 삽질!

적 캐릭터가 플레이어를 쫓아가게 하고싶은데, 이거저거 해봐도 안된다.. 

추적기능이 있는 컴포넌트는 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)