애니메이션 클립은 애니메이션에서 가장 작은 단위로써, 걷기 / 뛰기/ 숨쉬기 등 동작 하나하나를 나타내는 단위이다.


이것은 Animation을 분할해놓았을 경우 Animation 컴포넌트를 추가하게 되면 기본적으로 목록이 있다.


Animations라는 속성이 있고, 그것을 눌러보면 배열로 이루어진것을 볼 수 있다(기본은 size 0)


이 Animation에 Animations 배열 항목을 빼보는 방법은 다음과 같다.


public GameObject character;
Animation anim = character.GetComponent<Animation>();
        
foreach (AnimationState state in anim)
{
Debug.Log(state.name);
}



이렇게 하면,  anim안에 AnimationState 형의 값을 모두 가져와 Debug.Log에 이름을 출력한다.


만약, 이 이름을 전부 저장해서 사용하고 싶다면, string 배열에 저장을 해야할 것이다.


왜냐하면, 애니메이션을 실행하는 문장은 


        anim.Play("Death");


와 같이 Play 함수 뒤에 string 형을 매개변수로 적어야 하기 때문이다.


foreach()문을 어떻게 for문으로 변경해야 하는지 많이 검색을 해봤고, 시도를 해봤다.


그렇지만 실패했고, foreach문에서 어떻게 반복되는 횟수 즉, index 값을 찾을까를 알아봤다.


그 결과, index를 외부에 변수로 선언하고, foreach()문 앞에 index++;으로 증가를 시키면 되는 간단한 것이었다.


따라서, string 배열 안에 애니메이션 클립의 이름을 넣는 코드는 다음과 같다.


        internal int index;        
foreach (AnimationState state in anim)
{
            animArray[index] = state.name;
Debug.Log(state.name);
            index++;
}


이렇게 하면 , foreach()에서 몇 번 째 요소인지 for문에서 i값으로 사용할 수 있다.


Posted by sungho88
,

Scene 'Scene_Play' couldn't be loaded because it has not been added to the build settings or the AssetBundle has not been loaded.

To add a scene to the build settings use the menu File->Build Settings...

UnityEngine.SceneManagement.SceneManager:LoadScene(String)

Source_Title:Press_Play() (at Assets/Scripts/Source_Title.cs:21)

UnityEngine.EventSystems.EventSystem:Update()


이렇게 나올 때가 있다.


검색을 해보니 다음과 같이 해결하면 된다.


해결 방법


씬을 따로 생성할 경우 본인은 새롭게 만들었지만,  유니에서는 아직 Scene에 대한 정보를 갖고 있지 않기 때문이다.


따라서 유니티에 명시해주어야 한다.


위 에러에서도 친절히 설명하고 있다.


File - Build Settings에 가서 씬을 추가하라고...


하는 방법은 위 사이트에 들어가서 해결하자.



Posted by sungho88
,

유니티에서 캔버스(Canvas)를 생성하면 다음과 같이 여러 컴포넌트가 기본적으로 생성된다.


-> Rect Transform, Canvas, Canvas Scaler, Graphic Raycaster


Canvas Scaler 컴포넌트는 캔버스 내 UI 요소의 전체적인 스케일과 픽셀 밀도를 제어하는 데 사용된다. 


스케일은 글꼴 크기와 이미지 경계 등 캔버스 아래의 모든 요소에 영향을 미친다.


쉽게 말해 화면의 크기 변화에 따른 UI크기 변화를 조절할 수 있다.




프로퍼티:

기능:

UI Scale Mode

캔버스에서 UI 요소가 스케일되는 방법을 결정합니다.

Constant Pixel Size

UI 요소가 화면 크기에 관계없이 동일한 픽셀 크기로 유지됩니다.

Scale With Screen Size

화면이 커질수록 UI 요소도 커집니다.

Constant Physical Size

화면 크기와 해상도에 관계없이 UI 요소가 동일한 물리적인 크기로 유지됩니다.

Constant Pixel Size를 사용할 경우 


유니티상에 개발 화면과 실제 디바이스 폰 화면 해상도가 크게 차이가 난다면, 폰에서 정말 콩알만하게 보이게 된다.


따라서, Scale With Screen Size 모드를 통해 화면이 커지면 UI 요소들도 커지도록 설정하는 것이 좋다.


여기서 Match로, 스케일링 레퍼런스로 너비 또는 높이를 사용할지, 아니면 둘 사이의 배합을 사용할지 결정합니다.



이 차이는 분명하다.


이 사진은 Constant Pixel Size을 적용한 것을 스마트폰에서 실행한 결과이다.


왼쪽 상단 버튼의 경우 새끼손가락으로 눌러야 터치 될 정도로 매우 작다.

 


이 글을 쓰게 된 이유이다.

Scale With Screen Size 모드를 사용하게 되면, 화면이 커지게 되면 UI도 커지게 할 수 있다.

이렇게 큼지막하게 나와 버튼 조작이 쉬워지고, 가운데 이미지도 시원시원하게 크게 나오게 된다.

Posted by sungho88
,

게임에는 반드시 설정 버튼이나 일시 정지를 통해 게임을 중단할 수 있어야 한다.


게임을 중단했을 때, 시간도 멈춰야 하며 게임 플레이 화면이 터치되서도 안된다.


유니티에서 화면은 기본적으로 Canvas로 구성하므로 Canvas를 하나 더 만들거나, Panel을 이용한다.


Canvas나 Panel이나 적용 방식은 동일하다.


 1. 시간을 멈춘다


Time.timeScale = 0;


반대는


Time.timeScale = 1;



2. 게임 플레이 화면 위에 또다른 화면을 오버랩해서 비활성화시킨다.


if(settingCanvas) settingCanvas.gameObject.SetActive(true);

if(settingCanvas) settingCanvas.gameObject.SetActive(false);


SetActive()를 사용해서

이렇게 해서, 껐다가 켰다가 할 수 있다.


위에 것은 settingCanvas를 활성화하겠다(일시 중지하겠다)
아래 것은 settingCanvas를 비활성화하겠다(다시 시작하겠다)


아예 사라지면 좀 이상하니까...


알파값을 넣어서 반투명으로 해보자. 이러면 화면 위에 화면이 올라온 것처럼 보이고 


반투명이라 게임 플레이 화면까지 보여서 좀 더 그럴듯해보인다.

Posted by sungho88
,

[소수점 처리]


소수점 처리를 위해 반올림 , 올림, 내림 함수가 존재한다.


유니티 소수점 처리는 보통 첫 번째 자리에서 이뤄진다.


[반올림]

Mathf.Round(float data) : 소숫점 첫 번째 자리에서 반올림. 반환형 float

Mathf.RoundToInt(float data) : 소숫점 첫 번째 자리에서 반올림. 반환형 int


[올림]

Mathf.Ceil(float data) : 소숫점 첫 번째 자리에서 올림. 반환형 float

Mathf.CeilToInt(float data) : 소숫점 첫 번째 자리에서 올림. 반환형 int


[내림]

Mathf.Floor(float data) : 소숫점 첫 번째 자리에서 올림. 반환형 float

Mathf.FloorToInt(float data) :  소숫점 첫 번째 자리에서 올림. 반환형 int

 

float형으로 기본적으로 반환되지만, int형으로 값을 받을 수도 있다.


ToInt를 기본함수 뒤에 붙여주면 int형으로 변환되어 반환된다.

Posted by sungho88
,

Mathf.Lerf()


Lerf()는 유니티 프로그램 작성 시, Vector3.Lerf()도 자주 봤다. 


두 오브젝트 간의 거리를 구하는 명령이다. 


Mathf.Lerf()가 뭔지 찾아보니 역시나 선형보간 해서 두 개 값 사이의 거리를 구하는 것이다.


선형보간이 도대체 무엇인가.??


모르면서 걍 사용하기만 했으나 이제는 알면서 사용하고 싶었다.


Mathf.Lerf()부터 정확하게 알기 위해 공식 API 홈페이지를 들어갔다.


(정의)

public static float Lerp (float a, float b, float t);


(파라미터)

Parameters

a

 The start value.

b

 The end value.

t

 The interpolation value between the two floats.


(리턴값)

시작점a와 끝점b의 두 값 간의 사이의 값을 보간한 float형.



(설명)


a와 b 간에 선형 보간한다. 매개변수 t의 범위는 0부터 1까지로 제한된다.

0일 때는 a가 리턴되며, 1일때는 b가 리턴된다. 즉, 0.5일때는 a와b의 중간점이 리턴된다.

 



Posted by sungho88
,

interact : 소통하다, 상호 작용하다.

interactable = 소통할 수 있는, 상호 작용 가능한. 정도로 의미를 해석할 수 있다.


UGUI에서 UI - Button을 생성하면 다음과 같이 컴포넌트가 몇 개가 기본적으로 생성된다.




위에서 보면 Button 컴포넌트에 Interactable이 체크되어 있다.

(버튼이므로 기본으로 버튼을 누를 수 있게 되어있다.)


만약, 이 버튼을 상황에 따라 비활성화하고 싶다면, 해당 버튼으로 들어 간 뒤 false로 바꿔주면 된다.


GetComponent<Button>().interactable = true;

GetComponent<Button>().interactable = false;


를 통해 게임 실행 도중 동적으로 활성화/비활성화할 수 있다.



Posted by sungho88
,

유니티에서 게임 오브젝트 찾는 법은 한두가지가 아니다.

이번에는 게임 오브젝트 내 게임 오브젝트 즉, 하위 게임오브젝트를 찾는 방법을 정리해보려 한다.


대표적으로 세 가지가 존재한다.


transform.FindChild(string str)

transform.GetChild(int index)

transform.childCount


자식이 무엇인가. 

하이어라키(Hierarchy)에서 계층 구조를 이루고 있는 형태를 말한다.



상위에 GameObject가 부모이며 들여쓰기 된 하위 1~6까지의 6개의 GameObject가 자식이다.

이제, 자식을 찾는 방법을 알아보자.


1. 이름으로 자식 GameObject를 찾는 방법(자기 자신)


transform.FindChild("이름");


2. 번호 순으로 자식 GameObject를 찾는 방법(자기 자신)


transform.GetChild(번호);


여기서 자기 자신이란, 해당 스크립트가 컴포넌트가 된 상태를 말한다.

만약, 외부의 게임오브젝트를 찾는 것은 앞에 어떤 GameObject인지를 명시해줘야 한다.


3. 이름으로 다른 게임오브젝트의 자식 GameObject를 찾는 방법(외부 게임오브젝트)


otherGameobject.transform.FindChild("이름");


4. 번호 순으로 다른 게임오브젝트의 자식 GameObject를 찾는 방법(외부 게임오브젝트)


otherGameobject.transform.GetChild(번호);

 

물론 otherGameobject는 스크립트에서 어떤 게임오브젝트인지 선언해줘야 한다.


그 외에도 childCount 가 존재하는데, 이것은 자식 오브젝트의 개수를 알 수 있다.


Transform에 연결되어 있는 자식 트랜스폼들의 갯수입니다.


즉, transform.childCount 으로 자식의 개수를 불러 올 수 있다. ( 위 같은 경우 6 출력)



원래 기본적으로 자식의 Transform을 얻고 싶을 때 사용하는 것이다.


하지만 이를 통하여 GameObject나 Component 모두 얻을 수 있다.


 


Posted by sungho88
,

C# 스크립트에서 변수를 여러 개 선언하게 되면,


유니티에서 Inspector내 스크립트에 줄줄이 나온다.(public으로 선언했을 경우)


그런데 이 변수가 어떤 기능을 하는 것인지 까먹어 C# 스크립트로 들어가서 코드를 리뷰할 때가 있다.


이런 것을 방지하기 위해 유니티에서는 Tooltip을 제공한다.



[Tooltip("이것은 넘버1이다.")]
    public GameObject number01;

이렇게 작성하면,

 

이렇게 마우스를 갖다대면 설명이 나온다.


그래서 스크립트로 돌아가서 확인하지 않아도 되므로 주석과 더불어 프로젝트 시 사용할 수 있다.

Posted by sungho88
,

- Input.GetMouseButtonDown : 마우스 버튼을 누른 순간


뒤에 소괄호 안에 숫자 0, 1, 2에 따라 마우스 왼쪽버튼, 오른쪽버튼, 휠버튼으로 나뉜다.


누른 순간 true로 변환되며, 아무것도 안 했을 때 기본적으로 false로 구분됨. 


using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour { void Update() { if (Input.GetMouseButtonDown(0)) Debug.Log("Pressed left click."); if (Input.GetMouseButtonDown(1)) Debug.Log("Pressed right click."); if (Input.GetMouseButtonDown(2)) Debug.Log("Pressed middle click."); } }

OnMouseDown() 보다는 Input.GetMouseButtonDown()을 추천한다.


그 이유는 



    void OnMouseDown()
    {
        print("OnMouseDown~~");
    }

    void Update () {
        if (Input.GetMouseButtonDown(0))
        {
        print("Input.GetMouseButtonDown!!");
        }
    }


이렇게 하고 실행을 해보니, 이유는 모르겠으나 


Input.GetMouseButtonDown!!만 게속 출력되고, OnMouseDown은 실행이 되지 않는다.


또한,


OnMouseDown() 함수는 모바일에서 적용되지 않는다.

 

Posted by sungho88
,