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
,

프로그램시, 접근 범위를 결정하는 접근 제한자에 대해 정리해보려 한다. 


접근 제한자에는 public, protected, internal, private가 있다. 


네 가지의 접근 제한자에 대해 알아보려고 합니다. 아래는 4개의 접근 제한자를 정리해놓은 표입니다.


private


클래스 내부에서만 접근이 가능하다.


public 


모든 곳에서 접근이 가능하다.


internal


같은 어셈블리에서만 public으로 접근이 가능하다. 


protected


클래스 외부에서는 기본적으로 접근할 수 없으나 파생 클래스(자식 클래스)에서는 접근이 가능하다.


protected internal 


같은 어셈블리에서만 protected으로 접근이 가능합니다. 

 

주의할 점은 아무것도 선언하지 않는다면 기본적으로 private로 인식하게 된다.


internal때문에 이것을 검색하게 되었는데...


어셈블리는 즉, 해당 프로젝트 내와 같은 의미라고 할 수 있다.

Posted by sungho88
,

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


유니티에서 Inspector내 스크립트에 줄줄이 나온다.

(물론 public으로 선언했을 경우)


그런데 이 변수가 어떤 기능을 하는 것인지 기억이 안나 스크립트에서 코드를 다시 볼때가 있다.


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



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

이렇게 작성하면,

 

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


그래서 스크립트로 돌아가서 확인하지 않아도 되므로 요긴하게 사용될 수 있다.


물론, 원하는 변수에만 작성해서 사용할 수 있다. 

Posted by sungho88
,

- Input.GetMouseButton : 마우스 버튼을 누르는 동안


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


- Input.GetMousebuttonUp : 마우스 버튼을 눌렀다 때는 순간


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


위 3개 True/False로 구분됨. 

누르고 있거나, 눌렸거나, 뗏거나의 경우 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."); } }

Input.mousePosition : 화면에서 클릭 시 클릭한 마우스 좌표값을 얻을 수 있음.


둘 다 마우스 터치 시 사용한다고 하는데, OnMouseDown() 보다는 


Input.GetMouseButtonDown()을 추천한다.


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

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


이렇게 하고 실행을 했는데, 이유는 모르겠으나 


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


또한,


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


물론, Input.GetMouseButtonDown(0)의 경우 모바일에서 사용이 가능하다.


 

Posted by sungho88
,

초기화를 하지 않았든지 어떤 상황에서는 null이 발생할 가능성이 크다.


그래서 책들을 보면 널 체크를 반드시 해줘야한다는 내용을 종종 본다.


널 체크는 간단하지만 중요하다.


널 체크 방법은 다음과 같다.


Image myImage; 선언을 할테고...


체크할 때,

if (myImage != null)

   XXXXXXXXX


도 물론 가능하지만,


더욱 간단하게 체크할 수도 있다.


if (myImage)

   XXXXXXXXX


이렇게 해도 된다. 


주의할 점은 null이라면, 이 아니라 null이 아니라면 이 조건값이다.


따라서 null일때 뭔가를 해주고 싶다면


부정연산자 !를 붙여서


if (!myImage)

   XXXXXXXXX


로 작성해야 에러가 발생하지 않는다.


Posted by sungho88
,

유니티에서 쿨타임(쿨다운?) 기능을 사용하려고 한다.


RPG 게임에서 어떤 스킬을 사용했을 때, 


사용 후 일정 시간동안 못 쓰게 되고 일정 시간이 지난 후 다시 사용할 수 있게 된다.


[사용 방법]


하나 예제를 만들어보자..


Canvas - UI - Button으로 버튼을 생성한다.


Button을 클릭해보면, Image와 Button 컴포넌트가 기본적으로 만들어진것을 볼 수 있다.


- Image 컴포넌트


Source Image를 통해 버튼의 이미지 모양을 원하는대로 바꿀 수 있다. 

(Sprite 타입 이미지만 사용 가능)


버튼 이미지를 설정 후 Image Type을 Filled로 바꾸면 하위 항목이 다음과 같이 나온다.


여기서 Fill Amount 슬라이더가 생기는데, 


이 슬라이더 값을 0에서 1로 조절하면 버튼 이미지가 이에 따라 채워지는 영역이 변한다. 


이 값을 업데이트 해주면 쿨타임 버튼이 되는 것이다.


참고로,  


Fill Method를 통해 쿨타임의 형태를 바꿀 수 있고,

Fill Origin을 통해 쿨타임의 시작점(원점)을 바꿀 수 있다.


<Fill Method>

  1. Horizontal : 수평으로 쿨타임 적용. 
  2. Vertical : 수직으로 쿨타임 적용.
  3. Radial 90 : 90도로 쿨타임 적용.
  4. Radial 180 : 180도로 쿨타임 적용.
  5. Radial 360 : 360도로 쿨타임 적용.
Fill Origin은 어디서 쿨타임이 시작될 것인지 지정하는 것인데, 위 5가지에 따라 달라진다.


Fill Amount 슬라이더 값을 움직여보면 버튼이 사라지는 것을 볼 수 있다.


이것은 배경은 자동으로 만들어지지 않기 떄문에 사라지는 것처럼 보인다.


즉, 버튼 뒤에 동일한 위치에 배경을 깔아줘야한다.


그리고, Color를 원하는 색상으로 설정해보자. 다음과 같이 된다.




참고로, 빨간 배경을 버튼 위에 놓아야한다.


왜냐하면 Canvas 안에서는 순서대로 겹쳐서 쌓이는 계층구조이므로


빨간 배경이 버튼보다 아래 위치하면 빨간색이 보여지게 된다.


이제 게임 도중에 값을 변화하도록 스크립트를 작성해보자.


Create > C# Script로 스크립트를 하나 생성한다. 이름은 CoolTimeScript.cs로 생성했다.


[CoolTimeScript.cs]


public class CoolTimeScript : MonoBehaviour {
    public Image image;
    public Button button;
    public float coolTime = 10.0f;
    public bool isClicked = false;
    float leftTime = 10.0f;
    float speed = 5.0f;
    
    // Update is called once per frame
    void Update () {

        if(isClicked)
            if (leftTime > 0)
            {
                leftTime -= Time.deltaTime * speed;
                if(leftTime < 0) {
                    leftTime = 0;
                    if(button)
                        button.enabled = true;
                    isClicked = true;   
                }

                float ratio = 1.0f - (leftTime / coolTime);
                if(image)
                    image.fillAmount = ratio;
            }
    }

    public void StartCoolTime() {
        leftTime = coolTime;
        isClicked = true;
        if(button)
        button.enabled = false// 버튼 기능을 해지함.
    }
}



다음과 같이 작성한다.


유니티 On Click에서 버튼을 눌렀을 때 StartCoolTime()을 실행시키도록 하고,


Image와 Button은 버튼에 동일한 위치에 존재하는 컴포넌트를 집어넣어 주면 된다.

speed를 통해 쿨타임 시간을 조절할 수 있다.






Posted by sungho88
,

가장 간단한 방법으로는 


        transform.Rotate();

을 사용하면 된다.
 
이 스크립트를 회전시키고자 하는 게임오브젝트에 컴포넌트로 붙여주면 된다.

코드는 다음과 같다.

public float turnSpeed = 10;

    // Update is called once per frame
    void Update () {
transform.Rotate(Vector3.forward, turnSpeed * Time.deltaTime);
    }





Posted by sungho88
,

유니티 3D와 2D의 차이점이 무엇인지 궁금해서


각각의 프로젝트를 따로따로 생성해본 뒤, 캡쳐를 해서 비교해봤다.


생성 직후,


유니티 3D에는 빛(Directional Light)이 초기에 생성되어 있었지만, 2D에는 카메라 1개만 생성되어 있었다.


또한, 메인카메라(MainCamera) 모드에도 차이가 있었다.


유니티를 2D로 프로젝트 생성시, MainCamera 초기 화면


유니티를 3D로 프로젝트 생성시, MainCamera 초기 화면



Projection


- orthographic : 카메라가 퍼스펙티브에 상관없이 객체를 균일(uniform)하게 렌더링한다.

- perspective  : 카메라는 퍼스펙티브를 그대로 놔둔 채로 객체를 렌더링한다.



2D를 만들 것인데 3D 프로젝트를 만들었다면,,


Clear Flags 를 Solid Color로 바꿔주고, Projection만 바꿔준다면 2D 환경으로 변환할 수 있다. 

Posted by sungho88
,

콜라이더(Collider)


Collider는 게임 오브젝트의 컴포넌트 중 하나이다.

- Collider는 물리 충돌 처리를 위한 오브젝트의 형태를 정의한다. 

Collider는 게임시 눈에 보이지 않는 요소이므로 오브젝트와 정확하게 동일한 모양일 필요는 없다.

- Collider와 유사한 물리 충돌 처리를 위한 개념으로 Trigger가 존재한다.

Collider는 두 물체가 맞부딪쳤을 때, 서로 튕겨나가지만 Trigger의 경우 충돌하지 않고 통과된다.

- Collider과 Trigger 모두 충돌 시 일어날 때 발생할 상황을 스크립트 코드로 작성이 가능하다.

3D에서는 박스 콜라이더, 스피어 콜라이더, 캡슐 콜라이더를 사용할 수 있다. 

- 2D에서는 박스 콜라이더2D와 써클 콜라이더2D를 사용할 수 있다.

- 정교한 Collider를 만들기 위해 한 게임오브젝트에 여러개의 Collider를 생성하는 것도 가능하다.


OnCollisionEnter()




(예제)

void OnCollisionEnter2D(Collision2D other)
{
if (other.collider.tag == "YELLOW")
{
print("노란색이당~");
} else if(other.collider.tag == "BLUE")
print("파란색이당~");
}


이렇게 하면, 두 물체가 서로 부딪히는 순간(콜라이더가 만나는 순간) 호출하게 된다.


즉, 


태그가 YELLOW인 물체에 닿게 되면 노란색이당~

태그가 BLUE인 물체에 닿게 되면 파란색이당~


이 콘솔에 뜨게 된다.


void OnTriggerEnter2D(Collider2D other)
{
if (other.collider.tag == "YELLOW")
{
print("노란색이당~");
} else if(other.collider.tag == "BLUE")
print("파란색이당~");
}


q






Posted by sungho88
,