[ 추가 지식 ]

# 코루틴과 Invoke는 MonoBehaviour을 상속 받는 Class에서만 사용 가능하다.

# 코루틴에 매개변수 전달시 StartCoroutine("FunctionName", 매개변수) 를 통해 전달할 경우 1개의 매개변수만 전달 가능

 ~> 2개 이상의 매개변수 전달시 StartCoroutine(FunctionName(매개변수, 매개변수)) 와 같이 코루틴을 호출
# GameObject가 비활성화인 상태에서는 Find 함수를 통해 찾을 수 없다.
 ~> 활성화된 부모를 찾아 자식을 찾는 형식으로 접근해야 한다.
# transform.position을 통해 Player를 움직일 경우 떨림 현상이 발생한다.
 ~> 물리 계산 과정에서 발생하는 현상으로 rigid.MovePosition 를 통해 해결할 수 있다. (rigid는 Rigidbody Component)
# 같은 Canvas 안에서의 UI는 Hierarchy 창에서 밑에 있을수록 출력 우선순위가 높다.
 ~> 다른 Canvas 간의 UI 출력 우선순위는 Hierarchy 창을 통해 변경할 수 없고 Sort Order를 통해 변경할 수 있다.
# Awake()는 일반적으로 게임이 시작되기 전에, 모든 변수와 게임의 상태를 초기화하기 위해서 호출된다.
  Start()는 Behaviour의 주기 동안에 1번만 호출된다. (즉, Script Instance로 활성화된 경우에만 실행된다.)

# UI는 Component로 Transform이 아닌 RectTransform을 가진다.

 ~> 이를 단순히 transform.position 를 통해 이동시 전혀 의도치 않은 방식으로 이동하게 된다.

 ~> GetComponent<RectTransform>().anchoredPosition 을 통해 이동시 올바르게 이동한다.

      (이는 Anchor 를 기준으로 position을 결정하는 것)

# string 비교시 == 는 참조를, Equals()는 값을 비교한다.

 

 

 

[ 인벤토리 생성 ]

 

우선 인벤토리를 위한 Panel을 생성한 뒤

생성한 Panel 아래에 [ 오른쪽 마우스 ] - [ UI ] - [ Scroll View ] 를 생성하고

생성한 Scroll View를 인벤토리 Panel에 맞춰 크기를 조절한다.

 

 

Scroll View의 Scroll Bar는 필요없기 때문에 삭제한다.

 

 

Scroll View 아래의 Viewport 아래의 Content Object에 Button을 여러개 추가한 뒤 (정렬 확인 용도)

Content Object에 Grid Layout Group Component를 추가하여

Cell Size와 Spacing의 조절을 통해 자식 Object를 정렬한다.

또한 Constraint는 Flexible이 아닌 Fixed Column Count로 변경하여 열의 개수를 제한한다.

 

 

정렬이 끝났으니 버튼을 1개만 남기고 나머지는 전부 지운 다음

Outline Component를 추가하거나 Sprite를 변경하는 등 버튼을 꾸민다.

 

그 후 버튼 아래의 Text는 필요가 없으므로 지우고

버튼의 이름을 Slot으로 변경한 뒤

아래에 [ 오른쪽 마우스 ] - [ UI ] - [ Image ] 를 통해 Image를 추가한다.

( 해당 image는 Slot에 아이템이 들어올 경우 띄워주는 역할 )

 

 

Image의 이름을 ItemImage로 변경한 뒤

해당 Slot을 프리팹화한다.

 

 

그 후 Slot을 Ctrl + D를 통해

여러개 복제하면 인벤토리 완성이다.

 

 

만약 Scroll View가 필요없는 Inventory일 경우

인벤토리를 위한 Panel에 Grid Layout Group Component를 추가하고

Panel 바로 밑에 Slot들을 생성하면 된다.

 

 

 

[ 2D Tilemap Sprite를 Slice 하는 방법 ]

1. 우선 Slice 하고자 하는 Sprite의 Sprite Mode를 Multiple로 변경한 뒤 Sprite Editor를 클릭

2. 왼쪽 위 [ Slice ] 를 클릭한 뒤 Type을 Grid By Cell Size로 변경한 뒤 수치를 적절히 조정 후 Slice 클릭

3. Sprite의 Advanced에서 Filter Mode를 Point (no filter)로 바꾸고 Compression을 None으로 바꿔야 화질이 선명하다.

 

[ Tile Palette 사용 방법 ]

1. [ Window ] - [ 2D ] - [ Tile Palette ] 를 통해 사용 가능하다.

2. Create New Palette 를 통해 새로운 Tile Palette 생성이 가능하다.

3. 사용하고자 하는 Tile, Sprite, Sprite Texture를 끌어 Tile Palette에 옮긴다.

( 참고 : 첫번째는 타일 선택 / 두번째는 타일 이동 / 세번째는 선택한 타일로 페인트 칠하기 )

( 참고 : Palette 수정시 Edit 선택, 페인트 칠시 Edit 선택 해제 )

4. [ Hierarchy ] - [ 오른쪽 마우스 ] - [ 2D Object ] - [ Tilemap ] 을 통해 Tilemap 생성이 가능하다.

5. 생성한 Tilemap 위에 원하는 Tile을 페인트 칠한다.

 

< 만약 Player가 해당 타일 위를 밟고 이동할 경우 아래 과정을 수행 >

6. 4번에서 생성한 Tilemap에 페인트 칠을 한 뒤 Tilemap Collider 2D Component를 추가한다.

    (Tilemap Collider 2D Component는 Tilemap에 맞춰 Collider를 생성)

7. 6번에서 추가한 Tilemap Collider 2D Component 추가시 생성된 Collider는 각 타일마다 따로 생성된다. 이렇게 분할된

    Collider는 퍼포먼스 상의 문제, 끼임 문제 등이 발생할 수 있다.

8. 따라서 이를 해결하기 위해 제공되는 Composite Collider 2D Component를 같이 추가해주는 것이 좋다.

9. Composite Collider 2D Component 추가시 Rigidbody 2D Component가 자동으로 함께 추가되는데 Rigidbody 2D의

    Type을 Dynamic이 아닌 Static으로 바꿔준다. (Dynamic일 경우 중력 작용으로 아래로 무한히 추락함)

 

[ 2D Tilemap Extras 추가 방법 ]

원래 Unity에서 2D Tilemap Extras를 공식 지원하지 않았는데 이제 공식 지원을 해준다.

 > 이는 2D Tilemap 기능과 함께 사용하기 위한 추가 스크립트가 포함된 패키지로 Tilemap 기능을 위한 Custom Tile과

    Brush를 제공한다.

 

[ Edit ] - [ Project Settings ] - [ Package Manager ] - [ Advanced Settings ] 의 Enabel Pre-release Packages를 체크한 뒤

[ Window ] - [ Package Manager ] 에서 packages를 Unity Registry로 바꾼 뒤 2D Tilemap Extras를 import 할 수 있다.

 

[ 2D Tilemap Extras 사용 방법 ]

Project 창에서 [ 오른쪽 마우스 ] - [ Create ] - [ 2D ] - [ Tiles ] 에서 생성 가능하다.

 

[ Rule Tile 사용 방법 ]

# 일반적인 Rule Tile 사용 방법

1. Project 창에서 [ 오른쪽 마우스 ] - [ Create ] - [ 2D ] - [ Tiles ] - [ Rule Tile ] 에서 사용 가능하다.

2. +를 통해 Number of Tiling Rules를 추가할 수 있다. ( 즉, 규칙의 개수를 추가 가능 )

3. 인접한 Tile이 존재하는 곳은 왼쪽 마우스를 통해 초록색 화살표를,

    존재하지 않는 곳은 오른쪽 마우스를 통해 빨간색 X를 입력하여 Rule을 설정할 수 있다.

4. 설정을 끝마친 Rule Tile을 Tile Palette로 끌어다가 추가한 뒤 사용할 수 있다.

 

5. [ Hierarchy ] - [ 오른쪽 마우스 ] - [ 2D Object ] - [ Tilemap ] 을 통해 Tilemap을 생성하여 페인트 칠을 하면 아래와 같이

   설정한 Rule에 따라 잘 동작하는 것을 볼 수 있다.

 

6. 위의 과정을 반복하여 여러개의 Tilemap을 생성시 Tilemap의 [ Inspector ] - [ Tilemap Renderer ] - [ Additional Settings ]

    의 Order in Layer를 적절하게 설정한다. (ex : 땅 Tilemap의 Order in Layer는 0, 꽃 Tilemap의 Order in Layer는 1)

     

# Rule Tile을 사용한 Animation Tile 생성 방법

1. Project 창에서 [ 오른쪽 마우스 ] - [ Create ] - [ 2D ] - [ Tiles ] - [ Rule Tile ] 에서 사용 가능하다.

2. +를 통해 Number of Tiling Rules를 추가할 수 있다.

3. Rule의 Output을 Single이 아닌 Animation으로 설정한다.

4. Animation으로 사용할 Sprite의 개수만큼 Size를 설정한 뒤 Sprite를 드래그 앤 드롭으로 연결해준다.

5. Min Speed와 Max Speed를 통해 Animation의 속도를 조절할 수 있다.

     

# 외부 경계 설정 방법

1. Border 역할을 할 Tilemap을  [ Hierarchy ] - [ 오른쪽 마우스 ] - [ 2D Object ] - [ Tilemap ] 을 통해 생성

2. 1번에서 생성한 Tilemap에 Tilemap Collider 2D Component, Tilemap Collider 2D Component, Composite Collider 2D를

    추가하고, Rigidbody 2D의 Type을 Static으로 변경해준다.

3. 2번에서 추가한 Tilemap Collider 2D Component의 Used By Composite를 체크하여 Composite에게 모양을 위임한다.

4. Palette에서 아무 타일을 선택하여 경계선을 만든다.

5. Tilemap Renderer Component의 Mask Interaction을 Visible Inside Mask로 변경하여 보이지 않도록 한다.

 

 

 

 

[ Scene 전환시 BGM 유지 ]

 

첫번째 Scene에서 Audio Source Component를 가진 Object에 아래와 같은 Script를 Componet로 추가

 

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

public class MusicManager : MonoBehaviour
{
    GameObject[] BackgroundMusics;
    AudioSource audioSource;

    void Awake()
    {
        BackgroundMusics = GameObject.FindGameObjectsWithTag("Music");

        if (BackgroundMusics.Length >= 2)
            Destroy(this.gameObject);

        DontDestroyOnLoad(transform.gameObject);
        audioSource = GetComponent<AudioSource>();
    }
}

 

본인은 첫번째 Scene에서

BGM을 바로 재생하였다.

 

DontDestroyOnLoad를 통해

첫번째 Scene에서 두번째 Scene으로 전환시

BGM 유지가 성공적으로 이루어졌으나

두번째 Scene에서 첫번째 Scene으로 다시 돌아갈 경우

BGM이 중첩되는 현상이 발생하였다.

 

이를 Length 확인을 통해 해결하였다.

 

 

[ 볼륨 조절 ]

 

우선 Project 창에서 Audio Mixer를 1개 생성한다.

( Audio Mixer란 Audio Source에 대한 제어, 균형 및 동적 조정을 제공 )

 

 

Audio Mixer를 처음 생성하면 위와 같이 Master만 존재하는데

Groups의 +를 통해 BGM, SFX 등등을 추가해준다.

 

일단 BGM만 추가했다.

 

 

하나의 그룹을 선택한 뒤 Inspector 창을 보면

Attenuation에 Volume이 있는데 [ 오른쪽 마우스 ] - [ Expose 'Volume (of BGM)' to script ] 를 클릭한다.

 

 

Volume 옆에 화살표가 생기면 정상적으로 완료된 것이다.

 

위의 과정을 모든 그룹에 똑같이 수행한다.

 

 

그 후 Exposed Parameters의 이름을 변경해주면

Audio Mixer 설정은 완료가 되었다.

 

 

이제 Inspector 창에서 Audio Source의 Output을 설정해준다.

(해당 Audio Source가 Audio Mixer의 Group 중 어디에 해당하는지)

 

 

BGM 기본 Volume이 너무 작아서 Inspector 창에서 Attenuation의 Volume을 5.00dB로 설정해줬다.

( Slider의 Max Value는 10으로 설정 )

 

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

public class AudioMixerController : MonoBehaviour
{
    public AudioMixer audioMixer;
    public Slider BGMSlider;

    void Awake()
    {
        BGMSlider.value = 5;
    }

    public void SetBGMVolume()
    {
        float volume = BGMSlider.value;

        if (volume == 0)
        {
            audioMixer.SetFloat("BGM", -80); // 음소거 기능
        }
        else
        {
            audioMixer.SetFloat("BGM", volume);
        }
    }
}

 

Script는 위와 같이 작성하고

 

 

 

해당 Script를 Component로 추가한 뒤

Audio Mixer와 BGM Slider를 드래그 앤 드롭으로 연결해준다.

 

 

그 후 Slider의 Inspector 창의 On Value Changed를

Script의 함수와 연결해주면 완성이다.

( On Value Changed는 Slider로 나타내는 Value가 변했을 때, 어떤 식으로 처리해줘야 하는지에 대한 정보를 입력 )

 

 

 

 

 

[ Splash Screen 설정 방법 ]

[ File ] - [ Build Settings ] - [ Player Settings... ] 에서 [ Player ] - [ Splash Image ] 에서 변경 가능

 

[ 마우스 Cursor 설정 방법 ]

원하는 마우스 Image의 Inspector 창에서 Texture Type을 Cursor로 설정, Advaneced - Read/Write를 체크

[ File ] - [ Build Settings ] - [ Player Settings... ] 에서 [ Player ] - [ Default Cursor ] 에서 변경 가능

(상황에 따른 Cursor 변경 없이 1개의 Cursor만 사용할 경우)

 

 

+ Recent posts