목차 - 무기 제작 - 에너미 제작 |
1. 무기 제작
수류탄 제작
: 마우스 우클릭 시 수류탄이 나올 수 있도록 제작한다.
1. 플레이어를 제외하고 물체에 닿으면 폭발하는 수류탄 오브젝트 생성 2. 사용자의 마우스 오른쪽 버튼 입력받기 3. 발사 위치에 수류탄 생성 4. 생성된 수류탄에 시선방향으로 물리적인 힘 가하기 |
Sphere 오브젝트 생성 뒤 다음과 같이 Rigidbody 컴포넌트를 추가한다.
스크립트를 생성한 뒤 적용하고 작성해보았다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BombAction : MonoBehaviour
{
// 충돌했을 때의 처리
private void OnCollisionEnter(Collision collision)
{
// 자기 자신을 제거한다.
Destroy(gameObject);
}
}
다음으로 수류탄이 투척되고 난 후 폭발 효과를 주기 위해서 Asset Store에서 효과를 다운해서 가져와준다.
DestoryEffect 스크립트를 다음과 같이 작성하고 프리팹에 추가한다.
public class DestroyEffect : MonoBehaviour
{
// 제거될 시간 변수
public float destroyTime = 1.5f;
// 경과 시간 측정용 변수
float currentTime = 0;
void Update()
{
// 만일 경과 시간이 제거될 시간을 초과하면 자기 자신을 제거한다.
if(currentTime > destroyTime)
{
Destroy(gameObject);
}
// 경과 시간을 누적한다.
currentTime += Time.deltaTime;
}
}
스크립트가 추가된 프리팹의 이름을 다음과 같이 변경하고 프로젝트 뷰로 끌어와서 새로운 프리팹으로 생성한다.
새 프리팹이 생성되고 나면 씬에 있는 프리팹은 삭제한다.
처음에 작성한 BombAction 스크립트를 이펙트가 나올 수 있도록수정한다.
ublic class BombAction : MonoBehaviour
{
// 폭발 이펙트 프리팹 변수
public GameObject bombEffect;
// 충돌했을 때의 처리
private void OnCollisionEnter(Collision collision)
{
// 이펙트 프리팹을 생성한다.
GameObject eff = Instantiate(bombEffect);
// 이펙트 프리팹의 위치는 수류탄 오브젝트 자신의 위치와 동일하다.
eff.transform.position = transform.position;
// 자기 자신을 제거한다.
Destroy(gameObject);
}
}
bombEffect변수에 폭발이펙트 프리팹을 추가한다.
다음으로는 플레이어와 수류탄이 충돌하지 않도록 플레이어 캐릭터와 수류탄 오브젝트에 Layer설정을 한 뒤 Project Settings에서 Physics항목에 들어가 충돌 체크박스를 해제한다.
-무기 발사
Bomb 오브젝트를 프로젝트 뷰로 옮겨와서 새 프리팹으로 생성하고 씬에 있는 프리팹은 삭제한다.
Player의 하위오브젝트를 생성한 후 이름을 firePosition으로 변경한다.
사용자의 마우스 우클릭으로 수류탄을 발사 할 수 있도록 PlayerFire 스크립트를 수정한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerFire : MonoBehaviour
{
// 발사 위치
public GameObject firePosition;
// 투척 무기 오브젝트
public GameObject bombFactory;
void Update()
{
// 마우스 오른쪽 버튼을 누르면 시선이 바라보는 방향으로 수류탄을 던지고 싶다.
// 마우스 오른쪽 버튼을 입력받는다.
if (Input.GetMouseButtonDown(1))
{
// 수류탄 오브젝트를 생성한 후 수류탄의 생성 위치를 발사 위치로 한다.
GameObject bomb = Instantiate(bombFactory);
bomb.transform.position = firePosition.transform.position;
// 수류탄 오브젝트의 Rigidbody 컴포넌트를 가져온다.
Rigidbody rb = bomb.GetComponent<Rigidbody>();
// 카메라의 정면 방향으로 수류탄에 물리적인 힘을 가한다.
rb.AddForce(Camera.main.transform.forward * throwPower, ForceMode.Impulse);
}
}
}
작성을 완료한 뒤 각각의 변수에 다음과 지정해준다.
총 제작
: 마우스 좌클릭 시 시선방향으로 총을 발사한다.
1. 사용자의 마우스 좌클릭 입력받기 2. 총알 생성 뒤 발사될 위치와 진행 방향 설정 3. 총알이 부딪힌 대상의 정보를 저장할 변수 생성 4. 총알 발사 후 부딪힌 물체가 있을 시 피격 이펙트 발생 |
PlayerFire스크립트를 다음과 같이 수정한다.
public class PlayerFire : MonoBehaviour
{
. . . (생략) . . .
// 피격 이펙트 오브젝트
public GameObject bulletEffect;
// 피격 이펙트 파티클 시스템
ParticleSystem ps;
void Start()
{
// 피격 이펙트 오브젝트에서 파티클 시스템 컴포넌트 가져오기
ps = bulletEffect.GetComponent<ParticleSystem>();
}
void Update()
{
. . . (생략) . . .
// 마우스 왼쪽 버튼을 누르면 시선이 바라보는 방향으로 총을 발사.
// 마우스 왼쪽 버튼을 입력받는다.
if (Input.GetMouseButtonDown(0))
{
// 총알 생성한 후 발사될 위치와 진행 방향을 설정한다.
Ray ray = new Ray(Camera.main.transform.position, Camera.main.transform.forward);
// 총알이 부딪힌 대상의 정보를 저장할 변수를 생성한다.
RaycastHit hitInfo = new RaycastHit();
// 레이를 발사한 후 만일 부딪힌 물체가 있으면 피격 이펙트를 표시한다.
if(Physics.Raycast(ray, out hitInfo))
{
// 피격 이펙트의 위치를 레이가 부딪힌 지점으로 이동시킨다.
bulletEffect.transform.position = hitInfo.point;
// 피격 이펙트의 forward 방향을 레이가 부딪힌 지점의 법선 벡터와 일치시킨다.
bulletEffect.transform.forward = hitInfo.normal;
// 피격 이펙트를 플레이한다.
ps.Play();
}
}
}
}
총 피격 이펙트를 받아와서 Player 오브젝트의 PlayerFire 컴포넌트에 있는 bulletEffect변수에 적용한다.
조준선 이미지도 다운해서 화면에 표시해주었다.. 유니티에서 이밎 쓸때는 아래처럼 스프라이트로 적용한뒤에 사용하면 된다.
적용시키고 실행시켜보면 아래와 같이 조준선이 생기고 총알이 벽에 충돌했을 시 이펙트가 나온다.
2. 에너미 제작
: 에너미의 상태를 구조화해서 FSM으로 동작하게 한다.
1. 에너미의 행동을 상태별로 분리해 다이어그램 만들기 2. 에너미 몸체 생성 3. 에너미 스크립트에 다이어그램에 작성한 각각의 상태 선언 4. 각 상태가 전환될 수 있도록 switch문 구성 |
아래와 같은 방식으로 에너미를 동작하도록 할 것이다.
[Hierarchy] - [+버튼] - [3D Object] - [Capsule]
생성 한 뒤 이름을 Enemy로 변경한다.
충돌처리를 쉽게 하기 위해서 Character Controller 컴포넌트로 추가한다.
'프로젝트해요 > 게임_개발' 카테고리의 다른 글
[Unity] #13. FPS 게임 제작(4) (0) | 2023.08.29 |
---|---|
[Unity] #12. FPS 게임 제작(3) (0) | 2023.08.28 |
[Unity] #10. FPS 게임 제작(1) (3) | 2023.07.09 |
[Unity] #9. 슈팅 게임 제작(5) (4) | 2023.07.07 |
[Unity] #8. 슈팅 게임 제작(4) (4) | 2023.07.06 |