적 캐릭터는 가만히 있다가 플레이어가 근접하면 플레이어를 향해 이동하기 시작합니다. 접촉하면 플레이어에 대미지를 입힙니다. Enemy 폴더를 만들어 관련 리소스를 저장합니다.
적캐릭터의 게임 오브젝트 만들기
적 캐릭터의 이미지도 멀티 스프라이트로 만들수 있습니다 . Image폴더에 있는 EnemyImage를 Enemy폴더로 옮깁니다. 32x32픽셀 도트이미지로 플레이어와 동일하게 스프라이트에디터에서 slice 합니다.
EnemyImage_9을 씬뷰에 끌어다 Enemy라는 게임오브젝트를 만듭니다.
Rigidbody2D, CircleCollider2D를 어태치합니다.
Enemy Tag를 만들어 설정하고 Sprite Renderer의 Order in Layer는 3으로 설정합니다. Rigidbody 2D의 Gravity Scale은 0으로 하고 Freeze Rotation의 Z를 체크합니다.
적캐릭터의 애니메이션 만들기
적 캐릭터의 게임오브젝트를 선택하고 애니메이션창을 엽니다. 중앙의 Create버튼을 클릭하면 애니메이션을 저장하는 창이나오고 Enemy폴더에 EnemyIdle라느 이름으로 저장합니다.
Enemy라는 애니메이션컨트롤러파일과 EnemyIdle이라는 이름으로 애니메이션 클립파일이 만들어졌습니다.
[Add Property]버튼을 눌러 Sprite Renderer>Sprite>+를 클릭해서 대기 애니메이션을 완성합니다.
다음과 같이 상하좌우 움직임 애니메이션도 만듭니다. 이전 플레이어 애니메이션과 비슷합니다. 해당 스프라이트를 동시에 씬뷰로 끌어다 놓으면 저절로 애니메이션이 만들어집니다.
EnemyDown : EnemyImage0~1
EnemyUp : EnemyImage2~3
EnemyLeft : EnemyImage4~5
EnemyRight : EnemyImage6~7
애니메이션 클립이 완성되면 씬뷰의 오브젝트들은 지우고 프로젝트뷰의 필요없는 컨트롤러는 제거합니다. 상하좌우애니메이션을 Enemy애니메이션 컨트롤러로 끌어다 놓습니다.
Player의 Dead Animation처럼 Enemy의 Dead 애니메이션도 만듭니다. Property에 Sprite Renderer.Color를 추가하고 마지막 프레임의 Alpha값을 0으로 설정합니다.
적 캐릭터 스크립트 만들기
EnemyController 스크립트를 만들어 Enemy폴더에 저장하고 씬뷰의 Enemy에 어태치합니다.
변수
Enemy 오브젝트의 이동관련 변수및 hp(생명력) 관련 변수 입니다.
// HP
public int hp = 3;
//이동 속도
public float speed = 0.5f;
// 반응 거리
public float reactionDistance = 4.0f;
float axisH; //가로 축 값(-1.0 〜 0.0 〜 1.0)
float axisV; //세로 축 값(-1.0 〜 0.0 〜 1.0)
Rigidbody2D rbody; //Rigidbody 2D
bool isActive = false; //활성 여부
public int arrangeId = 0; //배치 식별에 사용
애니메이션 Play()를 관리할 애니메이션 이름들과 변수입니다.
//애니메이션 이름
public string idleAnime = "EnemyIdle"; // 정지
public string upAnime = "EnemyUp"; // 위
public string downAnime = "EnemyDown"; // 아래
public string rightAnime = "EnemyRight"; // 오른쪽
public string leftAnime = "EnemyLeft"; // 왼쪽
public string deadAnime = "EnemyDead"; // 사망
//현재 애니메이션現在のアニメーション
string nowAnimation = "";
//이전 애니메이션
string oldAnimation = "";
Start()
Rigidbody2D 참조를 저장해 놓습니다.
void Start() {
//Rigidbody2D 가져오기
rbody = GetComponent<Rigidbody2D>();
}
Enemy와 Player의 거리가 reactionDistance이내로 들어오면 각도를 구하고 해당 애니메이션을 설정하고 이동할 벡터를 구합니다.
void Update() {
//Player 게임 오브젝트 가져오기
GameObject player = GameObject.FindGameObjectWithTag("Player");
if (player != null) {
if (isActive) {
//플레어이어와의 각도 구하기
float dx = player.transform.position.x - transform.position.x;
float dy = player.transform.position.y - transform.position.y;
float rad = Mathf.Atan2(dy, dx);
float angle = rad * Mathf.Rad2Deg;
//이동 각도에 따른 애니메이션 설정
if (angle > -45.0f && angle <= 45.0f) {
nowAnimation = rightAnime;
} else if (angle > 45.0f && angle <= 135.0f) {
nowAnimation = upAnime;
} else if (angle >= -135.0f && angle <= -45.0f) {
nowAnimation = downAnime;
} else {
nowAnimation = leftAnime;
}
//이동할 벡터 만들기
axisH = Mathf.Cos(rad) * speed;
axisV = Mathf.Sin(rad) * speed;
} else {
//플레이어와의 거리 확인
float dist = Vector2.Distance(transform.position, player.transform.position);
if (dist < reactionDistance){
isActive = true; //활성으로 설정
}
}
} else if (isActive) {
isActive = false;
rbody.velocity = Vector2.zero;
}
}
FixedUpdate()
Update()에서 구해진 axisH, axisV를 이용해 리지드바디의 속도를 설정해서 이동하게 만듭니다. 애니메이션도 플레이해줍니다.
void FixedUpdate() {
if (isActive && hp > 0) {
//이동
rbody.velocity = new Vector2(axisH, axisV);
if (nowAnimation != oldAnimation) {
// 애니메이션 변경하기
oldAnimation = nowAnimation;
Animator animator = GetComponent<Animator>();
animator.Play(nowAnimation);
}
}
}
OnCollisionEnter2D()
Arrow에 충돌하면 hp--를 해주고 0이 되면 사망처리를 합니다. Dead 애니메이션도 플레이하고 Destry()해줍니다.
private void OnCollisionEnter2D(Collision2D collision) {
if (collision.gameObject.tag == "Arrow") {
//데미지
hp--;
if (hp <= 0) {
//사망!
//=====================
//사망 연출
//=====================
//출돌 판정 비활성
GetComponent<CircleCollider2D>().enabled = false;
//이동 정지
rbody.velocity = new Vector2(0, 0);
// 애나메이션 변경
Animator animator = GetComponent<Animator>();
animator.Play(deadAnime);
//0.5초 후에 제거
Destroy(gameObject, 0.5f);
}
}
}
스크립트를 Enemy에 적용하고 전역변수 스트링을 적어줍니다. 스트링은 애니메이션의 이름입니다.(애니메이션객체가 이닙니다.)
여기가지 작업하고 씬뷰의 Enemy오브젝트를 Enemy폴더로 끌어다 프리팹으로 만들어 줍니다.
'유니티2D게임 > 탑뷰 액션 게임 업그레이드하기' 카테고리의 다른 글
9.4.x 게임UI를 관리하는 스크립트 만들기 (0) | 2023.05.24 |
---|---|
9.4 UI와 버추얼패드 만들기 (0) | 2023.05.24 |
9.2 배치 아이템 만들기 (0) | 2023.05.24 |
CH09 탑뷰 액션 게임 업그레이드하기 (0) | 2023.05.23 |