이제 적 캐릭터를 만듭니다. 움직이는 데미지 블록과 비슷합니다.
적 캐릭터는 다음과 같이 동작합니다.
플레이어가 접촉하면 게임오버가 됩니다. (Dead Tag)
일정 범위를 왔다갔다한다. (MovingBlock)
벽에 접촉하면 180도 방향을 바꾼다.
이번 예제에서 만들 적캐릭터 데이터는 Empty폴더를 만들어 저장합니다.
적 캐릭터 만들기
적 캐릭터는 4장에서 애니메이션이 되도록 이미지를 준비했습니다.
images폴더에서 enemy1~4를 한꺼번에 선택해 씬뷰에 끌어다 애니메이션을 만듭니다. 게임오브젝트와 애니메이션 이름을 Enemy로 변경합니다.
태그를 Dead로 설정합니다. Sprite Renderer 컴포넌트의 Order in Layer는 2로 합니다. 어태치할 컴포넌트는 RigidBody 2D, Circle Collider 2D, Box Collider 2D입니다. 어태치한 후 Rigidbody 2D의 Freeze Rotation에서 Z를 체크해 회전하지 않도록 합니다.
Circle Collider 2D와 Box Collider 2D의 위치는 다음 그림과 같이 설정합니다. Collider영역은 Edit Collider를 누르면 나타나는 영역과 점을 이용해 조정합니다.
Box Collider가 Circle Collider보다 약간 크고 isTrigger를 체크해서 충돌을 담당합니다.
Player라 접촉하기면 죽일수 있게 Enemy game object는 Dead Tag를 지정하였습니다. Player가 충돌하면 죽는 DeadZone이 함정, 니들, 적으로 늘어났습니다. Circle Collider2D는 지면과의 물리적 충돌을 처리하기위해 약간 아래로 내립니다. 원이 박스보다 접촉이 적어 저항이 적습니다.
적 캐릭터의 스크립트 만들기
스크립트를 하나 만들고 EnemyController라고 이름을 바꿉니다. 스크립트를 만들고 어태치합니다. 플레이어 캐릭터를 움직이는 PlayerController의 간소한 버전입니다.
변수
public float speed = 3.0f; // 이동 속도
public string direction = "left"; // 방향 right or left
public float range = 0.0f; // 움직이는 범위
Vector3 defPos; // 시작 위치
Start()
변수 direction이 "right"일 경우 스프라이트 localScale을 x축으로 반전시켜 줍니다. 현재위치를 디폴트위치로 합니다.
void Start() {
if (direction == "right") {
transform.localScale = new Vector2(-1, 1);// 방향 변경
}
defPos = transform.position; // 시작 위
}
Update()
적캐릭터가 이동범위를 벗어나면 direction="right"<->"left"로 방향을 바꿔준다. range가 0일 경우 범위 체크는 안하고 벽을 부딪쳐야만 반전한다.
void Update() {
if (range > 0.0f) {
if (transform.position.x < defPos.x - (range / 2)) {
direction = "right";
transform.localScale = new Vector2(-1, 1);// 방향 변경
if (transform.position.x > defPos.x + (range / 2)){
direction = "left";
transform.localScale = new Vector2(1, 1);// 방향 변경
}
}
}
}
FixedUpdate()
direction방향에 따라 velocity를 가속해준다
void FixedUpdate() {
// 속도 갱신
// Rigidbody2D 가져오기
Rigidbody2D rbody = GetComponent<Rigidbody2D>();
if (direction == "right") {
rbody.velocity = new Vector2(speed, rbody.velocity.y);
} else {
rbody.velocity = new Vector2(-speed, rbody.velocity.y);
}
}
OnTriggerEnter2d()
벽과 충돌하면 direction="right"<-> "left"를 반전시켜 방향을 바꿔준다. 충돌체크를 위해서는 BoxCollider 2D isTrigger가 체크되어 있어야 합니다.
private void OnTriggerEnter2D(Collider2D collision) {
if (direction == "right") {
direction = "left";
transform.localScale = new Vector2(1, 1); // 방향 변경
} else {
direction = "right";
transform.localScale = new Vector2(-1, 1); // 방향 변경
}
}
스크립트를 적캐릭터에 어태치하고 플레이한다.
Range가 0일 경우 무대 전체를 왔다갔다하면서 벽에 부딪치면 반대방향으로 달립니다. Range를 4로 하면 4만큼의 범위내에서만 움직입니다.
'유니티2D게임 > 게임에 장치 추가' 카테고리의 다른 글
7.6 마우스및 터치 패널 조작 구현하기 (0) | 2023.05.20 |
---|---|
7.6 게임에서 사운드드 재생하기 (0) | 2023.05.20 |
고정 포대 만들기 (0) | 2023.05.19 |
7.3 이동블록과 연동되는 스위치 만들기 (0) | 2023.05.19 |
이동 블록 만들기 (0) | 2023.05.19 |