프로젝트해요/게임_개발

[Unity] #11. FPS 게임 제작(2)

yenas0 2023. 8. 27. 07:48
반응형

 

 

 

목차

- 무기 제작
- 에너미 제작

 

 

 

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 컴포넌트로 추가한다.

 

반응형