전체 페이지뷰

2017년 9월 27일 수요일

Unity Tutorial: 2D Roguelike, part 8


Writing the Enemy Script



이번 시간에는 Enemy 스크립트를 작성하겠습니다. Scripts 폴더에 Enemy라는 스크립트를 생성하고 에디터로 엽시다.

역시 MovingObject 클래스를 상속하도록 수정합니다.

public class Enemy : MovingObject
{
    ...
}
cs

그리고 사용할 변수들을 선언합니다.
public int playerDamage; // 플레이어를 공격 시 줄어드는 포인트
private Animator animator; // 애니메이터 레퍼런스
private Transform target; // 플레이어의 위치
private bool skipMove; // 해당 턴에 이동할 것인지 결정
cs

다음으로 Start()를 오버라이드 하고 레퍼런스를 연결합니다.

protected override void Start ()
{
    animator = GetComponent<Animator>();
    target = GameObject.FindGameObjectWithTag("Player").transform;
    base.Start();
}
cs

그리고, AttemptMove를 오버라이드합니다.
protected override void AttemptMove<T>(int xDir, int yDir)
{
    // 움직임을 건너뛰어야 한다면
    if (skipMove)
    {
        // 다음 턴을 위해 false로 만들고 건너 뜀
        skipMove = false;
        return;
    }
    base.AttemptMove<T>(xDir, yDir);
    // Enemy가 이미 움직였으므로 true로 설정
    skipMove = true;
}
cs


다음은 게임매니저가 호출하여 적들을 플레이어 쪽으로 움직이게 하는 메소드입니다.

public void MoveEnemy()
{
    // 1또는 -1로 각 축의 방향을 정할 변수
    int xDir = 0;
    int yDir = 0;
    // 둘의 x포지션이 같을 때
    if (Mathf.Abs(target.position.x - transform.position.x) < float.Epsilon)
        // y축 상에서 타겟 쪽으로 한칸 움직여 줌
        yDir = target.position.y > transform.position.y ? 1 : -1;
    else // 둘의 x 포지션이 다르다면
        // x축 상에서 타겟 쪽으로 한 칸 움직여 줌
        xDir = target.position.x > transform.position.y ? 1 : -1;
    // Player를 대상으로 AttemptMove를 호출
    AttemptMove<Player>(xDir, yDir);
}
cs

이번에는 OnCantMove를 오버라이드 합니다.

protected override void OnCantMove<T>(T component)
{
    // component를 Player로 캐스트하여 저장
    Player hitPlayer = component as Player;
    // 받은 데미지만큼 음식포인트를 줄여줌
    hitPlayer.LoseFood(playerDamage);
}
cs

조금 더 작성할 것이 있지만 차차 추가하기로 하고 일단 여기서 작성을 마칩니다.
저장합시다.

댓글 없음:

댓글 쓰기