Unity/참고자료

Unity : 유니티 기초, 문법 , 게임 설계

치명적흑형 2021. 10. 6. 10:28

씬안(3D공간)에 있는 모든 오브젝트들은 게임오브젝트이다

유니티엔진은 컴포넌트 기반의 게임 엔진이다

예) 레고블록

게임오브젝트 안에 여러 컴포넌트들을 추가해서 새로운 기는을 하는 오브젝트로 만들수 있다


스크립트

C# + Unity 기능 -> 유니티 C# 스크립트

 

*****클래스 종류

1. MonoBehaviour상속 받는 클래스 -> 컴포넌트로서 동작, 자동으로 인스턴스화 됨, new 키워드를 사용할 수 없다

인스턴스의 생명주기를 제어 할 수 없다(엔진이 제어한다), 미리 정의되어 있는 이벤트 메서드들이 특정 타임에 자동으로 실행된다 ex) Start, Update메서드와 같이...

 

2. MonoBehaviour상속 받지 않은 클래스 -> 컴포넌트로써 동작 안함, new 키워드로 직접 인스턴스화 시켜줘야 한다


스크립트 생성시 주의사항

 

프로젝트 스크립스 폴더생성 스크립트생성

 

스크립트 생성시 기본 이름으로 생성된다.

스크립트 명을 수정해도 클래스 명이 바뀌지 않는다.

스크립트 명을 잘못 입력했을 경우 지우고 다시 만든다.


프로젝트창 안에 있는 리소스들은 모두 파일이다(파일은 에셋이다)

 

씬안의 모든 오브젝트는 게임 오브젝트다.

 

게임오브젝트는 클래스 (클래스는 참조형식 기본값 null)

실행되면 인스턴스화된다

 

오브젝트에 붙어있는 컴포넌트들 순서대로 인스턴스화 된다

 

MonoBehaviour를 상속받고 부착하지 않으면 인스턴스화 되지 않는다


기본적인 게임설계

 

1단계 화면에 놓일 오브젝트 나열

 

2단계 오브젝트를 움직일 수 있는 컨트롤러 스크립트를 정한다

-움직이는 오브젝트에는 오브젝트의 움직임을 제어하는 스크립트가 필요하다.

-오브젝트를 움직이는 스크립트를 컨트롤러 스크립트라고 한다.

 

3단계 오브젝트를 자동으로 생성할 수 있도록 제너레이터 스크립트를 정한다

-게임을 플레이할 때 생성될 오브젝트, 플레이어가 이동하거나 시간이 경과하면 출현하는 오브젝트

-제너레이터 스크립트라고 한다. 오브젝트를 생성하는 공장

 

4단계 UI를 갱신할 수 있도록 감독 스크립트를 준비한다

-게임의 UI를 조작하거나 진행 상황을 판단

-게임 전체를 관장할 수 있는 스크립트를 감독 스크립트라고 한다

 

5단계 스크립트를 만드는 흐름을 생각

-기본적으로 컨트롤러 -> 제너레이터 -> 감독 순서로 만든다


스크립트를 작성하면 먼저 해당 게임 오브젝트에 부착해주자


유니티 라이프사이클 메서드

Awake : 항상 Start 함수의 이전 및 프리팹의 인스턴스화 직후에 호출됩니다. 

OnEnable : 오브젝트가 활성화된 경우에만 호출됩니다

씬에 추가 된 오브젝트에서 모든 스크립트는 Start, Update 등기 기타 함수가 호출되기 전에 Awake와 OnEnable 함수가 호출되는 것에 주의하십시오. 


당연히 오브젝트가 게임 플레이 중에 인스턴스화 되었을 때 강제로 호출할 수 없습니다.

Start : 스크립트의 인스턴스가 활성화되면 첫 번째 프레임의 업데이트 전에 Start가 호출됩니다.

Update : Update는 프레임마다 한 번씩 호출됩니다. 
이것은 프레임의 업데이트에 대한 주요 기능입니다.

OnDestroy : 오브젝트 생존기간의 마지막 프레임의 프레임 업데이트 후 OnDestroy가 호출됩니다 
(오브젝트는 Object.Destroy 또는 씬 종료시에 파기됩니다)

OnApplicationQuit : 이 함수는 응용 프로그램 종료 전에 모든 게임 오브젝트에서 호출됩니다. 
에디터에서는 사용자가 재생 모드를 중지하면 호출됩니다. 웹 플레이어에서는 웹 뷰가 닫힐 때 호출됩니다.

https://docs.unity3d.com/kr/current/Manual/ExecutionOrder.html

아웃렛 접속

스크립트 내의 변수에 오브젝트 실체를 대입(연결)하거나 변수를 수정할수 있도록 하는 방법.

아웃렛은 '콘센트에서 플러그를 꽂는 구멍'을 의미

 

1. 스크립트 쪽에 콘센트 구멍을 만들어야 하므로 스크립트 변수 앞에 public 접근 제한자를 붙인다.

2. public 접근제한자가 붙어있는 변수가 Inspector 창에 보인다

3. Inspector 창의 아웃렛에 오브젝트를 끼운다 (드래그 & 드롭)


스크립트에서  public으로 선언된 필드, 맴버는 인스펙터 창에서 접근 수정이 가능하다.

 

 

private로 선언된 필드는 [Serializable] 로 접근 가능하다

https://docs.unity3d.com/kr/2018.4/Manual/script-Serialization.html


UI를 만드는 방법

 

1. UI 부품을 Scene 뷰에 배치한다

2. UI를 갱신하는 감독 스크립트를 작성한다.

3. 빈 오브젝트를 만들고 작성한 스크립트를 적용한다.


효과음을 내는 방법

 

1. 효과음을 낼 오브젝트에 AudioSource 컴포넌트를 적용한다.

2. AudioSource 컴포넌트에 효과음을 설정한다.

3. 효과음을 울리고 싶은 시간에 스와이프하면 Play 메서드를 호출한다.

-효과음이 적용된 게임오브젝트와 연결된 스크립트에서 Play메서드를 호출해야 한다.


공장을 만드는 방법

 

1. 이미 있는 오브젝트를 사용해 프리팹을 만든다.

2. 제너레이터 스크립트를 만든다

3. 빈 오브젝트에 제너레이터 스크립트를 적용한다

4. 제너레이터 스크립트에 프리팹을 전달한다.


Debug.Log();

Console.Write(); 와 같은기능

https://docs.unity3d.com/kr/530/ScriptReference/Debug.Log.html

 

Debug.LogFormat(); : 합성문자열 서식?

Console.Write("{0} {1}", v1, v2); 와 같은기능, 문자열 보간 사용가능

https://docs.unity3d.com/ScriptReference/Debug.LogFormat.html


Input.GetMouseButton(int button   //0, 1, 2

마우스 버튼이 눌렸는지 여부를 반환합니다.

왼쪽 클릭을 검출하는 것 외에 탭을 검출하는 데도 사용할 수 있다. 

 

Input.GetMouseButtonUp(int button)    //0, 1, 2

유저가 주어진 마우스 버튼에서 손을 뗏을 때 true를 반환합니다.

 

Input.GetMouseButtonDwon(int button)    //0, 1, 2

유저가 주어진 마우스 버튼을 누른 프레임 동안 true를 반환합니다.

이 값은 매 프레임 재설정되므로 Update 함수 내에서 이 함수를 호출해야 합니다.

 

버튼이 0이면 좌클릭, 1이면 우클릭, 2이면 중앙을 클릭한 것입니다.

 

 

Input.mousePosition

Vector3 mousePosition; (반환값 Vector)

픽셀 좌표에서의 현재 마우스 위치를 나타냅니다.(읽기전용)

화면 또는 창의 왼쪽 아래부분이 (0,0)을 나타냅니다. 화면 또는 창의 오른쪽 위 부분은 (Screen.width, Screen.height)를 나타냅니다.

https://docs.unity3d.com/kr/530/ScriptReference/Input-mousePosition.html

Vector3.magnitude; : 벡터의 길이를 구해준다.


GameObject.transform

현재의 게임 오브젝트에 첨부된 Transform을 나타냅니다.

https://docs.unity3d.com/kr/530/ScriptReference/GameObject-transform.html

 

Transform

게임오브젝트의 위치, 회전 그리고 스케일(scale)을 나타냅니다.

씬의 모든 오브젝트는 트랜스폼을 가집니다. 오브젝트의 위치, 회전 그리고 스케일을 저장하고 다루기 위해서 사용합니다.

https://docs.unity3d.com/kr/530/ScriptReference/Transform.html

 

Transform.position (.x .y .z)

Transform의 월드 좌표입니다.
Unity 에디터와 스크립트를 통해 액세스할 수 있는 GameObject의 Transform의 position 속성입니다.

GameObject를 이동하려면 이 값을 변경하십시오.

https://docs.unity3d.com/ScriptReference/Transform-position.html

 

Transform.Rotate()

Transform.Rotate를 사용하여 다양한 방법으로 게임 오브젝트를 회전합니다. 회전은 종종 쿼터니언이 아닌 오일러 각도로 제공됩니다.

월드 축 또는 로컬 축에서 회전을 지정할 수 있습니다.

ex) transform.Rotate(90.0f, 0.0f, 0.0f, Space.World);

https://docs.unity3d.com/ScriptReference/Transform.Rotate.html

 

Transform.Translate()

 

 transform을 translation의 방향과 거리로 이동합니다

 

Declaration
public void Translate(Vector3 translation);
Declaration
public void Translate(Vector3 translation, Space relativeTo = Space.Self);

 

relativeTo = Space.Self 이동은 로컬 좌표
relativeTo = Space.World인 경우 이동은 월드 좌표

https://docs.unity3d.com/ScriptReference/Transform.Translate.html


using UnityEngine.UI.Text

 

글꼴 데이터를 화면에 그리는 기본 그래픽 

https://docs.unity3d.com/kr/530/ScriptReference/UI.Text.html


GameObject.Find

 

Declaration
public static GameObject Find(string name);

 

https://docs.unity3d.com/ScriptReference/GameObject.Find.html


Find 예제

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

public class Find : MonoBehaviour
{
    public GameObject hand;
    private void Start()
    {
        // This returns the GameObject named Hand.
        this.hand = GameObject.Find("Hand");   //찾음

        Debug.LogFormat("hand : {0}", this.hand);

        // This returns the GameObject named Hand.
        // Hand must not have a parent in the Hierarchy view.
        hand = GameObject.Find("/Hand");   //못찾음

        Debug.LogFormat("hand : {0}", this.hand);

        // This returns the GameObject named Hand,
        // which is a child of Arm > Monster.
        // Monster must not have a parent in the Hierarchy view.
        hand = GameObject.Find("/Monster/Arm/Hand");   //찾음

        Debug.LogFormat("hand : {0}", this.hand);

        // This returns the GameObject named Hand,
        // which is a child of Arm > Monster.
        hand = GameObject.Find("Monster/Arm/Hand");   //찾음

        Debug.LogFormat("hand : {0}", this.hand);


        //hand = GameObject.Find("/Monster/Arm"); 같다
        hand = GameObject.Find("Monster/Arm");   //찾음

        Debug.LogFormat("hand : {0}", this.hand);

        hand = GameObject.Find("/Arm");   //못찾음

        Debug.LogFormat("hand : {0}", this.hand);

        hand = GameObject.Find("Arm");   //찾음

        Debug.LogFormat("hand : {0}", this.hand);
    }
}


비활성화 되어있는 오브젝트를 찾으려면 해당 오브젝트의 부모를 찾아서 접근해야된다.

GameObject hpGauge;
    Image hp;
    //GameObject Canvas;
    GameObject gameOver;

    // Start is called before the first frame update
    void Start()
    {
        this.hpGauge = GameObject.Find("hpGauge");
        //this.Canvas = GameObject.Find("Canvas");
        //this.gameOver = this.Canvas.transform.Find("gameOver").gameObject;
        this.gameOver = GameObject.Find("Canvas").transform.Find("gameOver").gameObject;
    }

AudioSource.Play

 

클립을 재생합니다.

ex) GetComponent<AudioSource>().Play();

https://docs.unity3d.com/ScriptReference/AudioSource.Play.html