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

[Unity] #13. FPS 게임 제작(4)

yenas0 2023. 8. 29. 04:33
반응형

 

 

목차

1. 에너미 폴리싱
2. UI 제작 (피격효과)
3. 게임 매니저

 

1. 에너미 폴리싱

 

: 에너미의 외형을 좀비 캐릭터로 교체하기

 

Asset store에서 원하는 좀비 모양을 다운로드하고 임포트한다.

좀비 오브젝트를 Enemy의 하위 오브젝트로 추가하고 Transform을 리셋한다.

 

 

 

본인의 Enemy에 맞추어 캐릭터를 조정해준다. 다음으로는 캡슐이 보이지 않도록 Mesh Rederer 항목을 비활성화 시킨다.

 

 

 

다음으로는 각 Enemy의 상태에 맞는 애니메이션을 적용하도록 해보자..

 

 

좀비 모델링 선택하고 임포트 세팅에서 [Rig] 탭 클릭

[Animation Type][Configure..]이 다음과 같이 되어 잇는지 확인한다.

 

 

Animations폴더를 따로 만들고 [+ 버튼] - [Animatior Controller] 을 통해 새 애니메이터 컨트롤러를 생성한다.

이렇게 새로 생성한 컨트롤러는 드래그해서 좀비 오브젝트의 애니메이터 컴포넌트의 Controller 항목에 추가한다.

 

 

 

애니메이터 컨트롤러를 추가한 상태에서 Zombie Anim을 더블 클릭하면 씬 애니메이터 뷰가 나오게 된다.

 

마우스 우클릭을 통해 [Create state - Empty]를 누르고 빈 상태 박스도 생성한다.

 

프로젝트 뷰에서 Z_Idle.anim 파일 ( 정지상태에 쓸 애니메이션) 파일을 선택하고 Motion에 추가한다. New State의 이름은 Idle로 변경한다.

 

 

이런식으로.. 실행되는 걸 확인할 수 있다.

다른 동작도 이렇게 애니메이션을 통해 만들면 된다..

 

그리고 동작 간의 이동은 Trasition을 통해 상태전환을 만들어 낼 수 있다.

연결된 선이 Trasition이고 화살표 방향대로 동작이 변환된다.

 

 

 

 

 

2. UI 제작 (피격효과)

 

: 피격 될 때 화면에 효과부여

 

 

피격 효과 이미지 UI를 먼저 만들기 위해서 

[+버튼] - [UI] - [Image]를 선택해서 이미지를 생성하고 색상은 붉게 바꾸어준다 Trasition도 조정해준다.

 

다음으로 이미지가 화면에 꽉 차도록 앵커 타입을 Stretch타입으로 변경한다.

 

Rect TransfromTop, Bottom, Left, Right항목을 모두 0으로 변경해서 화면 전체에 꽉 차도록 변경하고

스크립트를 수정해야한다.

 

playerMove를 다음과 같은 방식으로 수정했다.

public class PlayerMove : MonoBehaviour
{
	. . . (생략) . . .
    
	// Hit 효과 오브젝트
	public GameObject hitEffect;
	. . . (생략) . . .
    
	// 플레이어의 피격 함수
	public void DamageAction(int damage)
	{
		// 에너미의 공격력만큼 플레이어의 체력을 깎는다.
		hp -= damage;
        
		// 만일, 플레이어의 체력이 0보다 크면 피격 효과를 출력한다.
		if (hp > 0)
		{
			// 피격 이펙트 코루틴을 시작한다.
			StartCoroutine(PlayHitEffect());
		}
	}
        
        . . . (생략) . . .
	// 피격 효과 코루틴 함수
	IEnumerator PlayHitEffect()
	{
		// 1. 피격 UI를 활성화한다.
		hitEffect.SetActive(true);
        
		// 2. 0.3초간 대기한다.
		yield return new WaitForSeconds(0.3f);
        
		// 3. 피격 UI를 비활성화한다.
		hitEffect.SetActive(false);

	}
}

 

때릴 때 함수가 발생하고 해당 함수는 아까 만든 빨간 화면을 활성화 하는 것이다.

 

때릴 때만 화면이 활성화 되어야 하니까 아까 만든 UI는 비활성화 시킨 다음에 스크립트를 적용하고 Hit Effect변수에 적용한다.

 

 

 

 

 

 

 

3. 게임 매니저

 

: 게임의 상태를 구분하고, 게임의 시작고 끝은 텍스트로 구분한다.

 

[Hierarchy] - [+ 버튼] - [UI] - [Text] 를 추가하고 크기는 Width 450, Height 100으로 설정한다.

 

문자열은 비워두고 폰트 스타일은 Bold를 적용시켜 둔다.

 

이 문자열을 다루기 위해 스크립트를 작성한다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class GameManager : MonoBehaviour
{
	// 싱글톤 변수
	public static GameManager gm;
    
	private void Awake()
	{
		if(gm == null)
		{
			gm = this;
		}
	}
    
    // 게임 상태 UI 오브젝트 변수
	public GameObject gameLabel;
    
	// 게임 상태 UI 텍스트 컴포넌트 변수
	Text gameText;

    
    void Start()
	{
		// 초기 게임 상태는 준비 상태로 설정한다.
		gState = GameState.Ready;
        
        // 게임 상태 UI 오브젝트에서 Text 컴포넌트를 가져온다.
		gameText = gameLabel.GetComponent<Text>();
        
        // 상태 텍스트의 내용을 ‘Ready...’로 한다.
		gameText.text = "Ready...";
        
		// 상태 텍스트의 색상을 주황색으로 한다.
		gameText.color = new Color32(255, 185, 0, 255);
	}
    
    // 게임 상태 상수
	public enum GameState
	{
		Ready,
		Run,
		GameOver
	}
    
	// 현재의 게임 상태 변수
	public GameState gState;

. . . (생략) . . .

}

이런 식으로.. 싱글톤 패턴을 적용해서 구현하면 된다.

 

 

구현한 뒤

[Hierarchy] - [+ 버튼] - [Create Empty] 를 한 뒤 이름을 Game Manager로 변경한다.

생성한 오브젝트에 앞서 작성한 스크립트를 추가하고 Game Label 항목에 Text_GameState 오브젝트를 추가한다.

 

이런식으로 시간이 흐르면서 Ready에서 Go 로 변경하는 건 코루틴 함수를 이용하면 구현할 수 있다.

 

해당방식으로 게임이 끝났을 때 (플레이어의 피가 0이 되어 사망) 했을 때 게임이 끝났다는 표시도 만들 수 있다.

반응형