-
<Stage>
우선 가볍게 스테이지부터 만들어준다. 여기서 주의할건 중심이 되는 Plane은 가급적 위치를 (0,0,0)으로 잡아주자
<Player>
Player가 될 Capsule 모양 오브젝트. 색을 입히고 싶다면 Material을 만들어준뒤 적용시켜주자
후에 있을 충돌판정을 위해 Tag를 Player로 선택해주고, Rigidbody 콜라이더를 입혀준뒤,
충돌시 오브젝트가 쓰러지는것을 방지하기 위해 Constraints에서 각각 고정시켜줄 축을 고정시켜준다
이제 PlayerControl 스크립트를 만들어 방향키나 WASD의 입력을 받아 이동하는것을 구현해보자
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerControl : MonoBehaviour { public Rigidbody rigidbody; public float speed = 8f; void Start() { rigidbody = GetComponent<Rigidbody>(); } void Update() { float x = Input.GetAxis("Horizontal"); float z = Input.GetAxis("Vertical"); float xspeed = x * speed; float zspeed = z * speed; Vector3 newvelo = new Vector3(xspeed, 0, zspeed); rigidbody.velocity = newvelo; } public void Die() { gameObject.SetActive(false); } }
public Rigidbody rigidbody;
컴포넌트를 가져와 할당할 Rigidbody 타입의 변수를 선언한다
rigidbody = GetComponent<Rigidbody>();
rigidbody라는 이름으로 선언한 함수에 컴포넌트를 찾아 가져온다
GetAxis 함수로 변수 x와 z에 수직,수평값을 받은뒤 xspeed, zspeed에 그 값의 speed를 곱한 값을 받아준다
그리고 일정속도를 유지해주기 위해 velocity를 이용한다
public void Die()
{
gameObject.SetActive(false);
}나중에 충돌판정을 위해 쓰일 메서드이다. Player 오브젝트를 비활성화 시켜준다
<Bullet>
Bullet을 발사할 Enemy를 만들기 전에 우선 BulletPrefab부터 만들어보자
기본 세팅이다. 원래 다른 콜라이더끼리 부딫히게 되면 충돌감지가 되어 팅겨져나가게 되지만
Bullet에는 Trigger로 설정함으로써 다른 콜라이더를 뚫고 지나갈수 있지만 충돌자체는 감지할수 있는 상태로 만들어준다
그리고 Bullet의 경우에는 중력의 영향을 받지 않게 해줄 예정이다
사실 Use Gravity 만 체크해제 하는 경우가 있고,
Use Gravity를 체크하는 대신 Is Kinematic도 함께 체크하는 경우도 있다.
아직은 둘이 무슨 차이인지는 모르겠다
이제 BulletControl 스크립트에서 총알이 전방으로 발사되도록 구현해보자
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BulletControl : MonoBehaviour { public float speed = 8f; private Rigidbody rigidbody; void Start() { this.rigidbody = GetComponent<Rigidbody>(); this.rigidbody.velocity = transform.forward * speed; Destroy(gameObject, 3f); } }
날아가는 속도는 8f, 리짓바디 컴포넌트 변수선언해서 넣어주고
velocity로 전방을 향해 speed의 힘만큼 일정하게 날려보낸다
Destroy(gameObject, 3f);
지금은 괜찮지만 게임이 완성되고 난다면 생성되는 Bullet의 갯수가 끝없이 늘어나기 때문에
3초가 지나면 자동으로 삭제되는 기능도 넣어두었다
이제 스크립트를 더 보완하여 충돌판정 기능도 추가해주자
public class BulletControl : MonoBehaviour { public float speed = 8f; private Rigidbody rigidbody; void Start() { this.rigidbody = GetComponent<Rigidbody>(); this.rigidbody.velocity = transform.forward * speed; Destroy(gameObject, 3f); } // 추가 private void OnTriggerEnter(Collider other) { if(other.tag == "Player") { PlayerControl playerControl = GetComponent<PlayerControl>(); if(playerControl != null) { playerControl.Die(); } } } }
이미 여러차례 해온 충돌판정. 하지만 확실하게 하기 위해 한번더 짚고 넘어가자
if(other.tag == "Player")
other(부딫힌 무언가)의 태그가 "Player"라면 실행하는 조건문
(맨 처음 Player의 태그를 "Player"로 정해주었다)
부딫히자마자 PlayerControl에 있는 Die 메서드를 실행해야 하기때문에 다음 if문이 오기전
컴포넌트를 가져온뒤 변수 playerControl이 null값이 아니라면 Die()메서드를 실행한다(사실상 무조건 실행하겠다는 뜻)
스크립트를 적용한뒤 Bullet을 프리펩으로 만들어주면 끝난다
<Enemy>
총알을 만들었으니 이제 이 총알을 발사할 Enemy를 만들어보자
우선 Cylinder 형식으로 만들고 빨간 Meterial을 입혀준뒤 복사하여 적절히 배치해준다
Enemy의 역할은 딱 하나다. Player를 바라보며 일정 범위내 랜덤한 시간으로 Bullet을 생성하는것
using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyControl : MonoBehaviour { public GameObject BulletPrefab; public float min = 0.5f; public float max = 3f; private Transform target; private float spawnrate; private float timeafterspawn; void Start() { timeafterspawn = 0; spawnrate = Random.Range(min, max); target = FindObjectOfType<PlayerControl>().transform; } void Update() { timeafterspawn += Time.deltaTime; if(timeafterspawn > spawnrate) { timeafterspawn = 0; GameObject bullet = Instantiate(BulletPrefab, transform.position, transform.rotation); bullet.transform.LookAt(target); spawnrate = Random.Range(min, max); } } }
스크립트 내에서 선언해준 BulletPrefab에 미리 만들어준 프리팹을 넣어준다