실전 Unity3D Engine Programing 과정 5일차 (2013.07.26 (금)) 


자료 모음: C:\Users\Mac\Documents

한글사이트: www.unity3dkorea.com 



##리뷰..

Component Centric 엔진


## 오늘 할일

- NGUI 

- 애니메이션


## NGUI 적용하기

- 어제 하던 것에서 NGUI 을 임포트한다.

- menu > Assets > Refresh 한다. 그러면 메뉴에 NGUI가 추가된다.


[설정]

GUI 는 그리팩 유저 인터페이스이다.

화면 해상도가 달라지면 대응하는 방법 안내

- 화면의 사각형의 모서리 엥커를 파악해 두고 거기서 이미지를 배치한다.

  총 9개의 앵커 (좌상단, 좌중단, 좌하단, 중상단, 중중단, 중하단, 우상단, 우중단, 우하단)

  총 9개의 앵커가 존재하며, 이 엥커를 기준으로 이미지를 배치한다.

- One Unit = 2/화면세로폭

- Root / 스크린의 높이

  - 자동으로 늘어나는 것을 언체크해 둔다. 해상도는 동일한 UI를 갖게된다.

  - 이 Root(불변 사이즈)를 기준으로 One Unit을 정의한다.

- Camera..  카메라 밑에 앵커를 둔다.

   - 앵커 밑에 판넬을 붙이다.

   - 판넬은 이미지, 라벨, 드로콜정보, 매트리얼 사용량 정보글 관리한다. 



[이제 작업해 보자]

어제 작업한 것중에 Camera의 Flare Layer, GUILayer, Audio Listener를 언체크한다. (오디오 리스너는 유일하게 하나이어야 한다.)



목표

- 상단에 점수, 10000M

- 하단에 목숨, 폭탄

 

이렇게 구성해 보자.


menu > NGUI > Create a New UI


창이 뜬다. Layer 선택하고 Add Layer하고  GUI 추가한다. 




다시 Layer를 선택하면 만든 GUI가 나온다. GUI를 선택한다.

그리고 create .. 선택하면 


하이어아키에 UI Root(2D)가 생긴다.

- Camera, 

   - Anchor

     - Panel

       -clipping을 설명. (화면에 보이는 것만 나온다.

이렇게 나온다. 이 각항목을  클릭해서 오른쪽 상세 내용을 보라..





Anchor를 복제해서 4개를 만든다.

그리고 앵커 이름을 각각 바꿔주다. 그리고 내부에 side를 좌우상하로 배치시킨다.

Anchor_TopLeft

Anchor_TopRight


판넬을 선택해서 menu > NGUI > create widget를 선택해서 팝업 화면이 나온다.



Atlas와 Font를 추가하고 Template는 Label로 한다. Add To한다.



아틀라스 만들자. (스프라이트 이미지를 하나의 파일로 재배치해서관리한다.)

- 텍스쳐 폴더에 모든 텍스쳐를 선택하고

- 상단에 menu > NGUI > Altras Make를 한다.

- 팝업에 Replace에 이름을 지정한다. 그러면 create가 나온다. 이 크리에이트 버튼을 누르면 

  아셋에 3개의 파일이 생성되는 것을 볼 수 있다.

  - 이미지를 선택하면 모두 아틀라스를 만들 수 있다. (최대 80개까지 포함시킬 수 있다.)




포트로 아틀라스로 만들 수 있다. BM폰트....


각 포지션으로 만든다.


버튼은  Achor_bottomRight에 추가하는데..

- 엠프티오브젝트를 만들고 이 것에 판넬을 추가한다.

- 이름 Button으로 한다.

- 이 버튼의 상세 내용중 Layer를 GUI로 변경한다.


그리고 이버튼에 menu > NGUI > Attatch Collider 를 추가한다.

그리고 Component > NGUI > interation > 버튼메시지, 버튼사운드, 버튼스켈일을 추가한다.



그리고 버튼을 눌러보면 아래와 같이 붙어 있다.



## 버튼을 누르면 메시지를 출력해 본다.

메인스크립트에 아래 내용을 추가한다.

using UnityEngine;

using System.Collections;


public class MainScript : MonoBehaviour {

public GameObject SkyGamera;

public float CameraRotateSpeed = 0.1f;


// Use this for initialization

void Start () {

}

// Update is called once per frame

void Update () {

//카메라를Y축으로돌리자. 축을 중심으로회전한다.

SkyGamera.transform.RotateAround(Vector3.up, Time.deltaTime * CameraRotateSpeed);

}

// 버튼누르면호출된다.

void Bomb() 

{

Debug.Log("Bomb Button Pressed");

}

}


메인오브젝트를 버튼에 넣어 주소
펑션은 상기 Bomb로 지정해 준다.
아래 그림을 참고 한다.



실행해서 버튼을 눌러보라 그러면 consol에서 메시지가 출력된다.



##이어서 하자.

보톰 라벨을 life로 하자.


모노라이브 > menu > search > go to file > uiLabel

맨밑에 아래 내용 추가후 저장 > 컨버터

void SetText(string s)

{

this.mText = s;

this.hasChanged = true;

}


메인스크립트에 아래 내용 추가

using UnityEngine;

using System.Collections;


public class MainScript : MonoBehaviour {

public GameObject SkyGamera;

public float CameraRotateSpeed = 0.1f;

public GameObject Distance;

public GameObject Life;

public GameObject Point;

private int playerLife  =3;

private int playerPoint = 0;

private float AccelSpeed = 100.0f;

 


// Use this for initialization

void Start () {

}

// Update is called once per frame

void Update () {

//카메라를Y축으로돌리자. 축을 중심으로회전한다.

SkyGamera.transform.RotateAround(Vector3.up, Time.deltaTime * CameraRotateSpeed);

Life.SendMessage("SetText", "X "+playerLife.ToString());

Point.SendMessage("SetText", "Point: "+playerPoint.ToString());

//N0(zero)를 넣어주면소숫점은절삭된다.

Distance.SendMessage("SetText", (Time.time*AccelSpeed).ToString("N0")+" m");

}

//총알이적군이랑충돌되면호출한다.

void Hit(int p)

{

this.playerPoint += p;

}

// 버튼누르면호출된다.

void Bomb() 

{

Debug.Log("Bomb Button Pressed");

}

}



에너미

public class EnemySprite :  SpriteBase {
public float Speed  = 10.0f;
public GameObject expolosion;
// Use this for initialization
void Start () {
gameObject.AddComponent<BoxCollider>();
}
// Update is called once per frame
void Update () {
float moveAmt = Speed * Time.deltaTime;
transform.Translate(Vector3.down * moveAmt);
//많이 떨어지면파괴한다.
if(transform.position.y < -4.0f)
{
InitPosition();
}
}
    void InitPosition()
{
transform.position = new Vector3(Random.Range(-3.0f, 3.0f), 5.0f, 0.0f);
}
//충돌되면 충돌된 것에 Tag를비교한다 Tag가가장빠르다.
void OnTriggerEnter(Collider other) 
{
if(other.tag == "bullet")
{
Instantiate(expolosion, transform.position, transform.rotation);
InitPosition();
//히어아키에서main을찾아온다.
GameObject main = GameObject.Find("Main");
main.SendMessage("Hit", 50);
}
}
}

메인에서 추가된 변수에 파넬에 각각 라벨을 붙여 준다.


assets store로 가서 로그인 하고 itween으로 찾는다.




hotween을 찾아 다운로드 설치한다.



붙인 것 샘플을 돌려 보자




## 클리어신을 만들어 보자

1. new scene , 이름은 win

2. menu > NGUI > create new ui > layer는 GUI로 변경한다.




   크리에이트 한다.

3. 위제만든다.

    아틀라스는 판타지 아틀라스붙인다.

4. 패널에 라벨3개, 스프라이트 하나 만든다.    

5. 라벨을 적당히 채운다.

6. 엠프티 오브젝트 만들고

-버튼

- 레이어는 GUI

- 그리고 판넬로 이동

- 위치 제조정

7. 버튼에 라벨과 스크립트 넣는다.

8. 스크립트 만든다.

using UnityEngine;

using System.Collections;


public class ResultUI : MonoBehaviour {

public Transform TitleLeft;

public Transform TitleRight;

public Transform Button;

IEnumerable Start() 

{

Debug.Log("Start Time "+Time.time);

//yield는양보로 기다렸다가 해당시간후다음라인이 동작한다.

yield return new WaitForSeconds(1.0f);

Debug.Log("Next Time "+Time.time);

}

}


아래 것은 양보를 한다. 인공지능에 사용할 수 있고, 그러나 초는 정확하지 않다.

yield 




UIRootdp 스크립트를 추가한다.

그리고 각각 연결한다.



다시 스크립트에 

using Holoville.HOTween; 추가한다.


스타트함수에 다시 코딩


라벨스테이션 포지션 -1050, 40, 0

라벨클리어 푖션 1050, 40, 0

으로 한다. 


그래서 1000을 빼주고 더해주면 화면들로 들어 온다.

실행해 본다.



상세에서

버튼도 스케일도 100, 100, 1로 변경해 본다.

버튼은 언체크 한다. 









using Holoville.HOTween;
using UnityEngine;
using System.Collections;

public class ResultUI : MonoBehaviour {
public Transform TitleLeft;
public Transform TitleRight;
public Transform Button;
IEnumerable Start() 
{
Debug.Log("Start Time "+Time.time);
yield return new WaitForSeconds(1.0f);
Debug.Log("Next Time "+Time.time);
HOTween.Init(true, true, true);
//stage
HOTween.To(TitleLeft, 0.5f, "localPosition", new Vector3(1000, 0, 0),true);
//clear
TweenParms tweenParams = new TweenParms().Prop("localPosition", new Vector3(-1000, 0, 0), true).Ease(EaseType.Linear).Loops(-1,LoopType.Yoyo);
HOTween.To(TitleRight, 0.5f, tweenParams);
yield return new WaitForSeconds(1.0f);
//button enable
Button.gameObject.SetActive(true);
// on Child widget
for(int i=0; i<Button.transform.childCount;i++)
{
Button.transform.GetChild(i).gameObject.SetActive(true);
}
//button animation
Sequence sequence = new Sequence(new SequenceParms().Loops(1, LoopType.Yoyo));
sequence.Append(HOTween.To(Button, 0.5f, new TweenParms().Prop("localScale", new Vector3(-110, -110, 0),true)));
sequence.Append(HOTween.To(Button, 0.5f, new TweenParms().Prop("localScale", new Vector3(20, 20, 0), true)));
sequence.Append(HOTween.To(Button, 0.5f, new TweenParms().Prop("localScale", new Vector3(-9, -9, 0), true)));
sequence.Append(HOTween.To(Button, 0.5f, new TweenParms().Prop("localEulerAngles", new Vector3(720,0,0),true)));
sequence.Play();
}
}





http://www.unity3dacademy.com/index.php?mid=EduInfo