저번 시간에는 타일맵 생성과 플레이어의 생성과 이동에 대해서 알아봤는데요
이번에는 적 생성 및 랜덤 하게 위치를 생성하는 만들어보려고 합니다.
저번 시간에 대해서 알고 싶으신 분들은 아래 링크에 들어와 주세요
적 생성 및 파괴, 랜덤 위치 생성
적 생성 및 파괴

우선은 Player를 생성했을 때처럼 적 개체를 생성한 후 Hierarchy창에 드래그 해줍니다.

적 개체에 Box Collider 2D와 Rigidbody2 D 컴포넌트 추가합니다.

빈 오브젝트 생성 후 GameMainger이나 다른 이름으로 바꾸거나
오브젝트에 GameManager스크립트 생성하여 추가합니다.
// 빈 오브젝트에 GameManger 코드 생성
public class GameManager : MonoBehaviour {
// 게임 오브젝트 변수를 선언 직렬화 생성
[SerializeField]
private GameObject Enemy;
void start(){
createEnemy();
}
void Update(){ }
private void createEnemy()
{
//Instantiater을 이용해서 오브젝트 생성
//Vector 3 = 생성할 위치
//Quaternion.identity = 오브젝트는 회전을 하지 않음
Vector3 pos = new Vector3(0, 6 , 0)
Instantiate(Enemy1, pos, Quaternion.identity)
}
}

적 개체를 Project 창으로 드래그하여 프리펩 생성합니다.

생성한 프리펩을 GameManger오브젝트의 적개체에 삽입합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameManager : MonoBehaviour
{
[SerializeField]
private GameObject Enemy;
void Start()
{
//코루틴은 함수명을 적는것이 아닌 코루틴 시작함수로 정의
//코루틴은 안에 반복문으로 지속적으로 Enemy이 생성
StartCoroutine(CreateEnemy());
}
void Update()
{ }
//코루틴을 이용하여 오브젝트를 일정 간격마다 생성
IEnumerator CreateEnemy1Routine() // 대기 전 실행
{
while (true)
{
CreateEnemy();
//대기시간 (1초) 대기 후 실행
yield return new WaitForSeconds(1);
}
} private void CreateEnemy()
{
Vector3 pos = new Vector3(0,6,0);
Instantiate(Enemy, pos, Quaternion.identity);
}
}

적 개체가 무한히 생성합니다.

Grid – Tilemap오브젝트에 Tag - Ground를 추가 설정합니다.
Player오브젝트에서도 Tag - Player로 설정합니다.
//적 개체 오브젝트 코드 생성
public class Enemy : MonoBehaviour
[SerializeField]
private Rigidbody2D rigidbody;
void Start(){
}
void Update(){
}
private void OnTriggerEnter2D(Collision2D collision)
//스크립트가 추가된 오브젝트가 다른 오브젝트에 접촉하면
Collision을 반환(Collider 컴포넌트가 추가)
{
//if(Collision.gameObject.tag ==“Ground”) 충돌한 물체의 태그명이 정확한지 확인하는 코드
if (collision.gameObject.tag == "Ground"){
Destroy(this.gameObject); //Destroy(); 함수는 오브젝트를 파괴
}
if (collision.gameObject.tag == "Player"){
Destroy(this.gameObject);
}
}
}

적 개체가 파괴되는 모습을 볼 수 있습니다.
랜덤 위치 생성
private void CreateEnemy()
{
//ViewportToWorldPoint와 유니티엔진의 랜덤을 이용하여 낙하물의 생성 위치를 랜덤하게 만듬
//일단 카메라 안에서만 생성이 되게 하기 위하여 ViewPortToWorldPoint를 이용
//Camera.main.ViewportToWorldPoint(); 메인 카메라의 공간을 월드 공간으로 바꾸어줌
//Viewport에서 카메라의 좌측끝이 X 좌표의 0우측끝이 1
//랜덤값으로 0~1까지의 값을 float형으로 가져와 x값에 넣어주고 0~1까지의 float값을 반환
//범위 값에 (0,1)을 하면 0만 반환
//y값은 1.1f로, z값은 0으로 화면에 생성
//ViewportToWorldpoint의 인자값은 Vector3 형태이므로 방금 전 값들을 new Vector3()에 넣어줍니다.
Vector3 pos = Camera.main.ViewportToWorldPoint(new Vector3(UnityEngine.Random.Range(0.0f, 1.0f), 1.1f, 5.0f));
Instantiate(Enemy, pos, Quaternion.identity);
}

게임을 실행하면 씬 화면에서는 제대로 떨어지는 것을 볼 수 있습니다.
private void CreateEnemy()
{
Vector3 pos = Camera.main.ViewportToWorldPoint(new Vector3(UnityEngine.Random.Range(0.0f, 1.0f), 1.1f, 5.0f));
// 만약 안나올 경우 카메라보다 앞쪽에 있어야 게임 화면에 표시하고 오브젝트를 제대로 나오기 위해 랜덤 값을 받은 pos의 Z값을 0.0f로 넣어 줌
pos.z = -1f;
Instantiate(Enemy, pos, Quaternion.identity);
}
적 파괴 애니메이션

이전 플레이어 애니메이션 때처럼 적이 파괴될 때의 애니메이션을 넣어줍니다.

애니메이션 컴포넌트를 오브젝트에 추가하고
애니메이션을 만들면서 생성된 Controller 파일을 Triangle 오브젝트의 애니메이터에 연결해 줍니다.

애니메이터 창에서 빈 공간을 우클릭 – Create State – Empty를 클릭하여 새로운 상태를 추가하여
상태를 Idle로 이름 변경, Idle 스테이트를 우클릭 – Set as Layer Default State를 선택합니다.
그리고 Triangle 애니메이터는 Idle 상태를 기본상태로 가지고 있게 만들고,
Idle 우클릭 Make Transition을 선택하여 Enemy상태에 연결합니다.

Parmaeters 탭에서 Trigger 파라미터를 생성하고 이름을 EnemyTrigger 파라미터로 생성합니다.
Idle – Enemy트랜지션을 클릭 후 Has Exit Time 체크해제, FixedDuration체크해제,
Conditions에 파라미터 추가합니다.
//적 개체 오브젝트 코드 생성
public class Enemy : MonoBehaviour
{
//Class의 Animator변수를 생성
[SerializeField]
private Animator animator;
void Start()
{
//Start()함수에서 GetComponent로 스크립트가 붙은 오브젝트의 애니메이터를 가져옴
animator = GetComponent<Animator>();
}
void Update()
{
}
//현재 오브젝트가 Ground 태그로 가진 오브젝트에 닿으면 SetTrigger함수에 Enemy를 할당
//OnTriggerEnter2D()함수의 내용을 OnCollisionEnter2D()함수로 옮겨줌
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "Ground")
{
animator.SetTrigger("EnemyTrigger"); //Destory함수 삭제
}
if (collision.gameObject.tag == "Player")
{
Destroy(this.gameObject);
}
}

적 개체에 BoxCollider2 D – is Trigger – 체크해제합니다.

애니메이터창 – Enemy스테이트 클릭 – Add Behaviour – 이름을 적고 생성합니다.

생성된 스크립트를 더블클릭해서 편집기를 켜면,
StateMachineBegaviour라는 코드는 유니티 5부터 사용가능한 기능으로
애니메이터의 상태에 따라 자동으로 호출하여 주석 처리 된 OnStateExit()의 주석을 제거합니다.
(Destory(animator.gameObject);를 입력, 현재 애니메이터의 게임 오브젝트를 파괴)

애니메이터 창에서 Enemy 우클릭 – MakeTransition – Idle 연결합니다.
EnemyState의 Speed를 조절하여
Enemy – Idle 트랜지션의 ExitTime과 TransitionDuration을 자연스럽게 조절합니다.
읽어주셔서 감사합니다.^^
'Unity > Unity 2D' 카테고리의 다른 글
[Unity 2D]장애물 피하기 게임 (1) (9) | 2024.10.09 |
---|---|
Unity 2D 텍스트와 씬에 대해 알아보자(2) (0) | 2024.09.12 |
Unity 2D 텍스트와 씬에 대해 알아보자(1) (0) | 2024.09.11 |
Unity 2D 물리 레퍼런스에 대해 알아보자 (1) | 2024.09.10 |
Unity 2D Asset(에셋) 및 애니메이션에 대해 알아보자 (2) | 2024.09.09 |