게임프로그래밍 개발 수업/유니티 수업

게임 개발반 프로그래밍 03 - 유니티 Collider OnTrigger, Light, Audio 재생

막뇌 2023. 3. 17. 15:29

프로젝트 명을 서바이벌 아일랜드로 설정하고 프로젝트 생성

오늘 사용한 Asset 들은 아래 링크에 첨부

 

https://drive.google.com/file/d/1RS7CAMORppg-DPw6jf_8gFBwjlouwkRe/view?usp=sharing 

 

수업자료03.17.zip

 

drive.google.com



압축을 풀고 하나씩 Asset폴더 하위항목으로 Drag&Drop 해줍니다.

 

모두 Drag&Drop한 상태

 

하단의 콘솔 창을 보면 에러가 나는 파일을 하나 찾을 수 있습니다.

 

에러의 원인이 되는 SimpleActivatorMenu 파일을 그냥 삭제합니다.

안에 있는 GUIText 가 원인이라고 하는데 중요한게 아니기 때문에 넘어갑니다.

 

 

BookAssets폴더는 넣지말고 놔둡니다.

Asset 폴더 하위 폴더로 폴더를 생성합니다.

 

위 사진을 보고 01.Scenes부터 06.Effects까지 쭉 생성해줍니다.

폴더중에 Car_Collection은 삭제합니다.

내부 폴더까진 건드리지 않고 지금 외부에 있는 큰 폴더들만 분류별로 정리해봅니다.

대충 정리 된 모습

 

01.Scenes 폴더안에 씬을 하나 새로 만들고 이름을 BattleFieldScene이라고 짓습니다.

 

 

 

 

대충 정리가 끝났다면 mainLevelMesh 폴더에 있는 fbx 파일을 Hierachy상으로 끌고 옵니다.

바다도 만듭니다.

Standard Assets > Environment, Water > Water4 > Prefabs > Water4Advanced

파일 경로 사진

 

바다의 스케일은 X20 Y1~5 Z20 정도면 될것 같습니다.

완성된 맵 모습

 

모델을 적용 했다면 항상 Generate Colliders 항목을 확인하여 Collider가 적용되어있는지 확인 해야 합니다.

적용이 안되어있으면 생성한 오브젝트가 밑으로 추락하는걸 볼 수 있습니다.

Select를 눌러서 모델을 자세히 볼 수가 있죠

 

체크가 안되어 있다면 꼭 체크해 줄 것

Scale Factor를 105사이즈로 살짝 키워주었습니다.

 

이제 저번시간과 똑같이 FPSController와 샷건을 만들어 줄겁니다.

Standard Assets > Characters > FirstPersonCharacter > Prefabs > FpsController를 Hirachy로 옮겨서 먼저 캐릭터를 만들고

파일경로
MainCamera의 AudioListener를 체크 해제 합니다.

MainCamera의 AudioListener를 체크 해제 합니다.

 

 

캐릭터의 시작 위치는 컨테이너들이 있는 이곳입니다.

 

 

CombatSG > meshes > CombatSG_Player를 Hierachy의 FPSController > FirstPersonCharacter에 붙여넣고Y좌표 조절(-2.7) 해주고, Select 들어가서 세부 항목

모델 크기 0.015

 

 

 

SPAS12 총의 모델 Material 찾기

쉐이더 설정 Bumped Diffuse

텍스쳐 입히기

 

매핑 완료 됐습니다.

 

 

 

앞에 보이는 계단을 걷기만 사용해서 올라가 봅니다.

계단이 너무 높아요

첫번째 계단이 너무 높아서 올라갈 수가 없어요.

 

모델러가 실수로 잘못 만든것이라고 볼 수 있는데요, 모델러한테 다시 부탁하기엔 애매한 이 때, 간단한 해결방법이 있습니다.

 

두부

큐브를 하나 생성해서 계단으로 가져옵니다.

QWER 단축키를 활용해서 늘리고 줄이고 기울여서 계단에 얇은 경사로를 하나 얹어 줍니다. 얇으면 얇을 수록 좋겠죠

저는 Y Scale을 0.1로 했습니다.

경사로를 만들었다면 이제 올라갈 수 있는지 보죠

잘 올라가네요

이제 Scene에서 큐브를 선택하고 Mesh Renderer를 체크 해제 해서 눈에 안보이게 해줍니다.

계단

메쉬 렌더러를 꼭 체크 해제 해서 그냥 계단처럼 보이게 해주세요

 

이제 형광등을 하나 설치 해 볼게요 PointLight로 계단을 올라가면 보이는 형광등에 불빛을 하나 설치합니다.

Range는 5

Intensity는 3정도가 좋겠네요

최대한 형광등 처럼 보이게 해주세요

그리고 Inpector 창에서 Add Componenet로 Capsule Collider를 하나 추가합니다. SphereCollider도 상관은 없습니다.

저는 Radius값을 5로 만들었는데 플레이어를 감지해서 가까이에 오면 켜지고 멀리 떨어지면 꺼지도록 만들 예정입니다.

적당히 플레이어를 감지할 범위로 Radius값을 주세요

GameScene에서 확인한 모습

이대로 게임을 해보면 만들어진 Collider 에 충돌판정이 생겨서 길이 막혀버리는걸 보실 수 있습니다.

이럴 때는 Collider Component 항목에서 Is Trigger를 체크 해주세요

이렇게 체크 해주시면 충돌 없이 지나가실 수 있습니다.

 

이제 본격적으로 스크립트를 짜 보죠

기본값이 일단 불이 꺼져 있어야 하니까 Light Component는 꺼주세요.

PointLight의 이름을 입맛따라 변경해줄게요

Stair_Light로 변경한 모습

FPSController에 Tag를 추가해줍니다.

 

Player라고 Tag를 해줄게요

 

 

스크립트를 만들어서 코드를 짜봅니다.

using UnityEngine;

public class LightONOFF : MonoBehaviour
{
    public Light stairlight;

  
}

먼저 이렇게 짜고 스크립트를 적용해봅니다.

 

 

 

 

 

None 이라고 되어있는 곳에 먼저 StairLight를 적용합니다.

 

using UnityEngine;

public class LightONOFF : MonoBehaviour
{
    public Light stairlight;
    void OnTriggerEnter(Collider other)
        //OnTriggerEnter는 Collider에 감지되었을 경우 진행되었을때 호출하는 문장들을 이야기하며, Collider 자료형에 other 매개변수가 쓰였다.
    {
        if (other.gameObject.tag == "Player");
        //매개변수 other를 사용, 게임오브젝트태그가 "Player"와 같을 경우
        {
            stairlight.enabled = true;
            //클래스 바로 밑에 전역변수로 선언된 stairlight를 켜라
        }
    }

}

다음은 코드를 이렇게 수정하고,  바로 게임씬에서 적용 되었는지 확인해봅니다.

 

Light의 Collider 와 접촉하니까 불이 들어오네요

이제 불에서 멀어지면 불이 꺼지도록 스크립트를 만들어 봅니다.

 

간단합니다.

void OntriggerExit 조건을 따로 만들고, 위의 코드를 복사해서 true만 false로 바꿔 보죠

using UnityEngine;

public class LightONOFF : MonoBehaviour
{
    public Light stairlight;
    void OnTriggerEnter(Collider other)
    //OnTriggerEnter는 Collider에 감지되었을 경우 진행되었을때 호출하는 문장들을 이야기하며, Collider 자료형에 other 매개변수가 쓰였다.
    {
        if (other.gameObject.tag == "Player");
        //매개변수 other를 사용, 게임오브젝트태그가 "Player"와 같을 경우
        {
            stairlight.enabled = true;
            //클래스 바로 밑에 전역변수로 선언된 stairlight를 켜라
        }

        
    }
    void OnTriggerExit(Collider other)
    //OnTriggerExit는 Collider에서 빠져나갔을 경우 호출하는 문장을 이야기 함.
    {
        if (other.gameObject.tag == "Player") ;
        //위와 같다
        {
            stairlight.enabled = false;
            //이번엔 불을 끈다.
        }
    }

}

 

결과를 보도록 하죠

 

OnTriggerExit가 제대로 동작하는 모습

 

이제 불이 켜지고 꺼질때마다 적당한 효과음이 들리도록 만들어 볼게요.

 

 

자료의 gun.wav 파일과

BookAssets 자료에 있는 Sound 폴더를 프로젝트 안의 05.Sounds 안으로 옮겨 줍니다.

Hierachy 창에서 방금까지 작업한 StairLight를 선택하고 Inspector 창의 Add Component

Audio > Audio Source를 통해 오디오 소스 컴포넌트를 생성해줍니다.

컴포넌트를 추가 해주세요

Audio Clip 컴포넌트를(빨간색)클릭 하여 원하는 소리를 선택 가능합니다.
menu_beep 선택

아래쪽에 있는 사운드 스펙트럼을 클릭하면 소리를 들어 볼 수 있어요.

 

형광등이 켜지는데 가장 어울리는 소리를 찾아 줍니다. 수업에서는 menu_beep로 결정.해당 사운드를 Audio Clip으로 선택해줍니다.

 

Min Distance와 Max Distance의 기본값은 1 / 500 인데

이는 소리가 들리는 최소, 최대 거리입니다. 형광등 켜지는 소리가 500m까지 들리면 너무 비효율적입니다.

5/20으로 수정합니다.

씬에서도 소리의 범위가 표시됩니다.

이제 스크립트로 형광등이 켜지고 꺼질때 소리를 재생해 봅니다.

using UnityEngine;

public class LightONOFF : MonoBehaviour
{
    public Light stairlight; //전역변수 불빛의 종류를 선택해주는 컴포넌트
    public AudioSource source; 
    //컴포넌트 생성 자료형 AudioSource 사용, 전역변수 source선언
    public AudioClip lightsound;
    //컴포넌트 생성 자료형 AudioClip 사용, 전역변수 lightsound선언
    void OnTriggerEnter(Collider other)
    //OnTriggerEnter는 Collider에 감지되었을 경우 진행되었을때 호출하는 문장들을 이야기하며, Collider 자료형에 other 매개변수가 쓰였다.
    {
        if (other.gameObject.tag == "Player");
        //매개변수 other를 사용, 게임오브젝트태그가 "Player"와 같을 경우
        {
            stairlight.enabled = true;
            //클래스 바로 밑에 전역변수로 선언된 stairlight를 켜라
            source.PlayOneShot(lightsound, 1.0f);
            //PlayOneShot함수는 (오디오클립, 소리볼륨값)을 인수로 전달받아서 작동하는 함수임을 알 수 있다. 역할은 말그대로 오디오 클립을 단 한번 재생하는 역할이다.
        }

        
    }
    void OnTriggerExit(Collider other)
    //OnTriggerExit는 Collider에서 빠져나갔을 경우 호출하는 문장을 이야기 함.
    {
        if (other.gameObject.tag == "Player") ;
        //위와 같다
        {
            stairlight.enabled = false;
            //이번엔 불을 끈다.
            source.PlayOneShot(lightsound, 1.0f);
            //위와 같아서 복사/붙여넣기 했다.
        }
    }

코드를 완성하고 돌아오면 Script에 컴포넌트가 추가로 2개 생겼습니다.

아래와 같이 소스와 클립을 넣어서 완성해줍니다.

 

 

소리On

이제 게임을 실행해서 확인해보면 형광등이 켜짐과 동시에 설정한 오디오클립도 재생되는것을 확인하실 수 있어요.

 

 

다음은 프리팹(Prefeb)에 대한 내용입니다.

프리팹이란?

미리 만들어놓은 게임 오브젝트, 템플릿을 말합니다.

폴더에 07.Prefebs라는 폴더를 추가해줍니다.

 

지금 우리가 작업한 StairLight를 07.Prefebs로 끌어다 놓습니다.

아래와 같이 아이콘이 바뀌는걸 보실 수 있습니다.

다음은 아이콘이 바뀐 오브젝트들을 가지고 Ctrl+D를 사용해서 앞에 있는 형광등들에 모두 적용 해봤습니다.

모든 오브젝트가 설치되어있는 이 상황에 공통적으로 편집할 작업이 추가되면 일일이 하나하나 적용 시키는게 굉장히 번거롭겠지만

프리팹이 적용되어있다면 파일 하나만 바꿔도 모든 파일들에 변경사항이 적용되게 됩니다.

 

Project 창에서 프리팹을 수정해봅니다. Light Color를 빨간색으로 수정해보죠

모든 오브젝트가 동시에 수정됩니다.

 

 

이번 수업시간에는 Unity의 빌트인 함수
OnTriggerEnter
OnTriggerExit
이 둘을 활용한 동작에 대해 알게 되었습니다.

Light와 AudioSource 출력에 대해서도 간단하게 배웠구요
마지막으로 프리팹(Prefeb)은 어떻게 만들고 사용하는지도 알아 보았습니다.