transform.RotateAround는 구버전으로, 사용되지 않는다.


에러가 발생하지는 않지만, 녹색으로 경고창이 뜬다.


경고는 다음과 같다.


'Transform.RotateAround(Vector3, float)' is obsolete: 'use Transform.Rotate instead.' [Assembly-CSharp]


쉽게 말하면,


transform.RotateAround은 구식이다. transform.Rotate을 대신 사용해라.


Posted by sungho88
,

public class Test01 : MonoBehaviour 

    public float testNum = 0; 


이런 클래스가 존재한다고 할 때, testNum 변수를 어떻게 불러올까?


물론... public으로 선언되어 있다고 가정한다. 


private를 사용했거나, 아무것도 작성하지 않을 경우 모두 외부에서 보이지 않으므로 사용할 수 없다.



public class MainClas : MonoBehaviour 

    void Start() 

   { 

     Test01 call = GameObject.Find("Test01 컴포넌트 붙은 오브젝트").GetComponent<Test01>(); 

        call. testNum = 5; // 접근해서 값을 수정할 수 있다. (주의해야함)

    } 


이렇게, Find()함수를 이용하여 오브젝트를 검색한 뒤, 


그 오브젝트에 Test01 스크립트 컴포넌트를 불러온다.


그런뒤에 변수(call)에 저장한다.


이제, 이 변수를 이용하여 public된 함수 및 변수에 자유롭게 접근할 수 있다.



Posted by sungho88
,

게임을 개발중에 라이트와 관련된 문제를 하나 발견했다.

원래 이렇게 흰색 배경으로 프로젝트를 진행 중이었다.
그런데, 게임 오버 되서 다시 게임을 시작할때... 현재 화면 그리고 메인화면으로 이동할때...메인 화면도 
아래와 같이 뭔가 어두운 색상으로 변했다. 처음에는 라이트 적용이 안 되었다고 생각을 했다.

예상과 달리 라이트는 체크되어 있었다. 
라이트 체크를 끄게 되면 아래과 같이 아예 검은색으로 변하는 것을 알았다. 

그렇다면 어떻게 라이트 색상이 변하지 않고 유지할 수 있을까?
아, 물론 이러한 현상은 게임을 빌드해서 실제 폰에서 실행했을 경우에는 이 현상이 발생하지 않는다고 한다.
하지만, 개발할 때 매우 신경쓰이므로 바꿔보자.
해결 방법은 다음과 같다.
상단 메뉴 - Windows - Lighting - Settings에 들어간다.

Lighting Setting 창이 열리는데, 가장 아래쪽에서 Auto Generate가 체크되어 있는 것을 볼 수 있다.

이 체크를 해제하면 옆의 Generate Lighting 버튼이 활성화가 된다.
 이 버튼을 클릭하면 유니티 에디터에서 테스트를 진행할 때에도 빛이 제대로 들어오는 것을 확인할 수 있다.
참고로, 씬이 여러개라면 해당 씬에 가서 위 작업을 반복해야 한다.


Posted by sungho88
,

UGUI에서는 Button 컴포넌트에 존재한다.


Button 컴포넌트를 추가하면  interactable라는 속성이 추가되어 있다.


이것은 기본적으로 버튼이 클릭될 수 있도록 미리 체크해서 설정해놓은 것이다.


이 체크를 해제하면, 버튼을 클릭할 수 없게 된다.


이것을 스크립트 코드에서 작성하려면, 


버튼 오브젝트 객체.interactable 로 쉽게 할 수 있다.


NGUI에서는 이 interactable라는 용어가 없어 찾았더니.


isEnabled라는 것이 존재한다.


버튼 오브젝트 객체.isEnabled으로 사용할 수 있으며 false일 경우 비활성화, true일 경우 활성화가 된다.


이렇게


UGUI에서, NGUI에서의 버튼 비활성화하는 방법에 대해 알아보았다.


Posted by sungho88
,

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


이것은 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
,

유니티에서 캔버스(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()를 사용해서 껐다가 켰다가 할 수 있다.(Toggle)


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

화면이 아예 사라지면 좀 이상하므로, 알파값을 넣어서 반투명으로 해보자. 


이러면 화면 위에 화면이 올라온 것처럼 보이고 


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



Posted by sungho88
,

Rect Transform은 캔버스 내의 모든 UI 요소에 대한 위치 지정 요소이며,


위치 지정, 앵커링(Anchoring), 피벗 등을 조정하는 데 사용됩니다.


새로운 UI 컴포넌트에서 일반 Transform 컴포넌트를 대체하는 새로운 컴포넌트이다.


Transform 컴포넌트는 씬에서 3D 오브젝트의 위치, 회전, 스케일을 표시한다.


반면 Rect Transform은 피봇 포인트와 관련된 폭 및 높이가 지정하는 2D 직사각형을 표시한다.


Rect Transform이 2D 직사각형을 표시하긴 하지만, 컴포넌트에는 회전 및 스케일, Z축 위치도 포함된다.


따라서 엘리먼트를 3D 오브젝트로 조작할 수 있다.


Rect Transform과 Transform의 중요한 차이점은 바로 앵커 개념이다.


부모가 Rect Transform 컴포넌트를 갖고 있으면 Rect Transform를 통해 부모에게 고정할 수 있다.


고정을 통해 UI 엘리먼트는 부모 UI 엘리먼트의 Rect Transform의 위치 및 크기를 기준으로 


움직이거나 늘릴 수 있다.


UI 엘리먼트는 직계자식은 아니더라도 궁극적으로는 캔버스의 자식이라는 점에 유의해야 한다.


Canvas 컴포넌트 자체는 Rect Transform를 갖는다.


따라서 거의 모든 UI 엘리먼트들의 부모도 Rect Transform를 갖게 된다.


 

Posted by sungho88
,

[클래스 소개]


이 PlayerPrefs 클래스를 사용하면 간단한 게임데이터를 쉽게 저장할 수 있음.

KEY - VALUE 형식으로 데이터를 저장하고, 다시 KEY를 이용해서 데이터를 조회/삭제도 가능함.


[저장 방법]


저장 가능한 타입은 : Int, Float, String


PlayerPrefs.SetInt(“number”,10); 

// number라는 키로 정수 10을 저장하라는 의미.  SetFloat, SetString도, 존재.


PlayerPrefs.GetInt(“number”); 

// number라는 키로 값을 꺼낼 수 있음.  GetFloat, GetString도 존재.


[삭제 방법]


PlayerPrefs.DeleteKey(“number”); 

// number라는 키값에 해당되는 값을 삭제함.


PlayerPrefs.DeleteAll(); 

// 모든 데이터를 삭제함(전부 삭제되므로 주의)

 

[데이터 키 유무 확인]


PlayerPrefs.HasKey(“number”); 

// number라는 키값이 존재하면 true, 존재하지 않으면 false

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

 


[거리 구하기]


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
,