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

[Unity] #16. FPS 게임 제작(7_최종)

yenas0 2023. 8. 29. 05:36
반응형
목차

1. 길 찾기 (메시 링크)
2. 스나이퍼 모드
3. 무기 효과

 

 

1. 길 찾기 (메시 링크)

 

네비게이션 이동 가능한 영역이 높이 차이 등으로 단절되어 있어도 오프 메시 링크(Off Mesh Link)기능으로 임의 연결이 가능하다.

 

테스트해보기 위해 임시로 아무 모양이나 생성했다. (전 큐브 모양함)

 

 

이렇게 오르고 내려갈 곳에 빈 게임 오브젝트를 배치해봤다. 꼭 저 파란색 안에다가 지정해야 움직임이 가능해진다.

 

 

[Add Component] - [Navigation] - [Off Mesh Link] 를 선택해서 추가한다 이런식으로.. 원하는 부분도 조절해주고..

 

 

에이전트가 최단 거리를 계산할 때 이동하는 Node마다 비용이 존재하는데 이 거리가 가장 짧은 거리로 이동하게 된다. 비용값은 내비게이션 뷰의  Area탭에서 확인하거나 추가할 수 있다.

 

오프 메시 링크를 포함하여 네비게이션 메시를 베이크하기 위해 먼저 아래 보이는 부분을 체크표시로 변경하여 준다.

 

하고 나서 [Bake]하면 적이 장애물을 넘어 올 수 있다.!!

(이거 안하면 적이 그냥 큐브모양 빙빙 돌아서 넘어옴 점프 못하고..)

 

 

 

 

 

 

 

2. 스나이퍼 모드

 

: 키보드 숫자 키 입력으로 무기모드를 일반 모드와 스나이퍼 모드로 전환한다.

 

PlayerFire 스크립트를 수정한다. 

무기 모드 변수를 전역 변수로 추가하고 Start()함수에서 초기 무기 설정은 일반 모드로 지정한다. 카메라 줌인 줌아웃으로 스나이퍼 모드를 구현할 예정이기 때문에 해당 상태를 체크하기 위한 변수도 미리 선언한다.

public class PlayerFire : MonoBehaviour
{
	. . . (생략) . . .
    
	// 무기 모드 변수
	enum WeaponMode
	{
		Normal,
		Sniper
	}
	WeaponMode wMode;
    
	// 카메라 확대 확인용 변수
	bool ZoomMode = false;
    
	void Start()
	{
		. . . (생략) . . .
        
		// 무기 기본 모드를 노멀 모드로 설정한다.
		wMode = WeaponMode.Normal;
	}
	. . . (생략) . . .
}

이런식으로..

 

하고 Update함수에서 버튼을 입력받았을 때 카메라의 시야각을 변경하는 방식으로 구현하면 된다.

 

 

스나이퍼 모드랑 일반 모드를 구별하기 위해서 하단 체력바 위에 텍스트로 구별할 수 있도록 하였다..

각각 모드가 구현되는 부분에 Text가 출력되도록만 스크립트를 수정하면 된다.

 

 

 

 

 

 

 

 

3. 무기 효과

 

: 총을 발사할 때마다 총구에 불꽃이 튀는 효과 주기

 

 

 

이 효과도 Asset Store에서 다운로드 받아서 임포트를 먼저 해주었다.

 

총구에서 이펙트가 나와야 하니까 총 끝에다가 위치를 맞추어 주었다.

 

사격 이펙트는 발사하는 순간에만 잠시 보였다가 일정 시간이 지났을 시에는 사라지도록 해야한다.

시간 체크를 편하게 하려고 코루틴 함수로 구현하였다.

 

PlayerFire 스크립트를 다음과 같은 방식으로 수정해서 구현해보았다.

void Update()
{
	. . . (생략) . . .
	// 마우스 왼쪽 버튼을 입력받는다.
	if (Input.GetMouseButtonDown(0))
	{
		. . . (생략) . . .
        
		// 총 이펙트를 실시한다.
		StartCoroutine(ShootEffectOn(0.05f));
	}
    
	. . . (생략) . . .
}

// 총구 이펙트 코루틴 함수
IEnumerator ShootEffectOn(float duration)
{
	// 랜덤하게 숫자를 뽑는다.
	int num = Random.Range(0, eff_Flash.Length - 1);
	// 이펙트 오브젝트 배열에서 뽑힌 숫자에 해당하는 이펙트 오브젝트를 활성화한다.
	eff_Flash[num].SetActive(true);
	// 지정한 시간만큼 기다린다.
	yield return new WaitForSeconds(duration);
	// 이펙트 오브젝트를 다시 비활성화한다.
	eff_Flash[num].SetActive(false);

 

 

총 뿐만 아니라 수류탄 효과도 동일하게 하면 피격 이펙트를 적용할 수 있다.

 

 

 

하고나서 게임 실행하니까 수류탄 폭발 범위가 문제가 있는 것 같아서 BomAction 스크립트도 수정을 해주었다.

(수류탄이 던져진 위치로 부터 일정 크기의 구 형태 부분이 데미지를 입는 방식으로 변경함)

 

 

 

 

 

 

최종적으로 게임 만든 결과물 영상이다. ((주변 배경같은게 없어서 휑하긴 하지만.. 

 

 

반응형