[Unity] Unity 기초강의 내용 정리 (2-12강 ~ 2-15강)

[Unity] Unity 기초강의 내용 정리 (2-12강 ~ 2-15강)

educast 나동빈 님의 <Mobile Defence Game 제작으로 배우는 Unity 기초> 강의를 듣고 내용 정리.

———-

2-12. Instantiate

Instantiate(object);

게임 실행 도중에 object를 생성하도록 해주는 함수

(*동적 : ‘게임이 실행되는 도중에’라는 의미.)

* 미리 오브젝트를 만들지 않고, 게임이 실행된 이후 동적으로 오브젝트를 생성

* Instantiate 함수는 Start 함수나 Update 함수에서 그냥(조건없이) 사용하면 안됨!

메모리 과부하로 에러가 발생할 수 있음.

(1) 프로젝트 뷰 Assets 폴더 안에 Sprites 폴더를 만들고,

캐릭터 1(당근모양 캐릭터) 그림을 Sprites 폴더 안에 넣는다.

(2) 프로젝트 뷰 Assets 폴더 안에 Scripts 폴더를 만들고,

Instantiate 이라는 이름의 C# 스크립트 파일을 만든다.

(3) 하이어라키 뷰 캐릭터 1(당근 캐릭터) 위에 Instantiate 파일을 드래그 앤 드랍하여

컴포넌트를 add 처리한다. Add Component 버튼을 이용해도 된다.

(4) 인스펙터 뷰에서 Add Component 버튼을 이용하여 Rigidbody 2D와 Box Collider 2D를 넣어준다.

(5) 인스펙터 뷰에서 Box Collider 2D 항목 내의 Edit Collider 버튼을 이용하여 충돌박스를 조절한다.

(6) 당근 캐릭터 아래쪽에 타일 그림의 오브젝트를 넣고, Box Collider 2D 를 넣는다.

Start 함수는 오브젝트 생성시 한 번만 실행되는 함수이지만,

Start 함수 안에 조건 없이 Instantiate 함수를 만든다면, 해당 오브젝트가 복제되면서 또 다시 Start 함수가 실행되므로 무한루프에 빠짐.

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Instantiate : MonoBehaviour {

 // Use this for initialization

 void Start () {

  

 }

 

 // Update is called once per frame

 void Update () {

  // 키입력 : 키보드 A를 누를 때마다 당근 캐릭터가 복제된다.

     if (Input.GetKeyDown(KeyCode.A)) {

            Copy();

        } 

 }

    void Copy() {

        Instantiate(gameObject);

    }   

}

———-

2-13. GetComponent와 AddForce

GetComponent<컴포넌트명>(). 컴포넌트의 값 혹은 함수

특정한 Object가 가지고 있는 컴포넌트 혹은 그 컴포넌트의 값에 접근하기 위한 함수

(예외적으로, GameComponent를 사용하지 않아도 되는 내장된 컴포넌트도 있음.)

아래와 같이 중력 값을 0 으로 고쳐서 캐릭터가 아래로 떨어지지 않게 수정할 수 있다.

GetComponent<RigidBody2D>().gravitySclae = 0;

* <> 가 의미하는 것은 <자료형> 임.

GetComponent<GameObject>();

이런 경우는 괄호안에 원래 bool 타입이 들어가야 함.

디폴트가 false로 되어 있는데, true를 넣으면 비활성화 된 오브젝트도 인식 가능.

* GetComponent 가 중요한 이유는 다른 오브젝트의 컴포넌트에도 접근할 수 있기 때문이다.

(ex : 주인공과 부딪힌 몬스터의 체력 조작)

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class GetComponentAddForce : MonoBehaviour {

 // Use this for initialization

 void Start () {

        GetComponent<Rigidbody2D>().gravityScale = 0;

    }

 

 // Update is called once per frame

 void Update () {

       

    }

}

* AddForce

GetComponent<RigidBody2D>().AddForce(Vector3.up[down,righ,left] * 숫자);

RigidBody2D 컴포넌트의 함수로, object에 힘을 가하여 움직이는 함수

* AddForce 는 RigidBody2D 컴포넌트 안에 내장되어 있는 함수. 많이 사용하는 함수.

(1) 캐릭터를 화면 위쪽으로 보내기

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class GetComponentAddForce : MonoBehaviour {

 // Use this for initialization

 void Start () {

        float jumpPower = 50.0f;

        GetComponent<Rigidbody2D>().gravityScale = 0;

        GetComponent<Rigidbody2D>().AddForce(Vector3.up * jumpPower);

    }

 

 // Update is called once per frame

 void Update () {

       

    }

}

(2) 사용자가 스페이스 바를 눌렀을 때 점프 실행

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class GetComponentAddForce : MonoBehaviour {

    float jumpPower = 200.0f;

    // Use this for initialization

    void Start () {

    }

 

 // Update is called once per frame

 void Update () {

        if (Input.GetKeyDown(KeyCode.Space)) {

            GetComponent<Rigidbody2D>().AddForce(Vector3.up * jumpPower);

        }

    }

}

* 보통 점프 기능 구현 시 오브젝트가 지면에 닿아있을 때 한해서만 점프 가능하도록 구현함.

(3) 점프에 좌우 이동 기능까지 추가

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class GetComponentAddForce : MonoBehaviour {

    float jumpPower = 200.0f;

    // Use this for initialization

    void Start () {

    }

 

 // Update is called once per frame

 void Update () {

        if (Input.GetKey(KeyCode.LeftArrow)) {

            transform.Translate(Vector3.left * 0.1f);

        } else if (Input.GetKey(KeyCode.RightArrow)) {

            transform.Translate(Vector3.right * 0.1f);

        }

        if (Input.GetKeyDown(KeyCode.Space)) {

            GetComponent<Rigidbody2D>().AddForce(Vector3.up * jumpPower);

        }

    }

}

———-

2-14. 이벤트 함수 Start와 Update

이벤트 함수 : Unity에서 스크립트마다 일정 규칙에 의해 실행되도록 정의된 내장함수

(Start : 초기화 함수, Update : 매 프레임마다 실행되는 함수)

* 이벤트 함수는 우리가 직접 만든 함수와 다르게, 이미 그 목적과 실행 시점이 정해져 있음.

유니티 실행 순서 (사용자가 바꾸지 못하고 이미 정해져 있음)

1. Start() – 초기화(Initialization) 부분

2. … – 에디터(Editor) 부분 * 스크립트가 새롭게 적용되거나 리셋될 때 에디터에서 실행되는 부분. 실제 사용할 일은 드물다.

3. OnCollisionXXX – 물리 법칙(Physics) 부분

4. OnMouseXXX – 입력 이벤트(Input Events) 부분

5. Update() – 게임 로직 (Game Logic) 부분

6. … – 렌더링(Scene Rendering) 부분

1, 2는 오브젝트 초기화 시점에 실행되고, 3부터 6까지는 Destory 함수가 호출되기 전까지 무한반복된다.

———-

2-15. 이벤트 함수 OnCollision과 OnMouseDown

OnCollisionXXX : 다른 오브젝트와 충돌이 발생했을 때 이를 감지함.

OnMouseXXX : 마우스 클릭을 감지함.

OnCollisionXXX 함수의 댚적인 예제

OnCollisionEnter2D(Collision2D other) {

 // 충돌 처리;

}

* 2D 게임이므로 OnCollisionEnter2D 이며, 3D 게임이면 OnCollisionEnter 임.

* 함수명에 Enter 가 붙어있으므로, 충돌 중이나 충돌 이후가 아닌 충돌 처리 시작되는 시점임

* 충돌 처리를 위해서는 두 물체 중 한 개는 OnCollisionXXX 함수가 있어야 함.

* other는 충돌한 상대방 오브젝트를 의미함.

프로젝트 뷰에서 OnCollisionTest 라는 이름의 C# 스크립트를 만들고,

하이어라키 뷰에서 캐릭터 1(당근 캐릭터) 위에 드래그 앤 드랍하여 컴포넌트 추가.

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class OnCollisionTest : MonoBehaviour {

 // Use this for initialization

 void Start () {

  

 }

 

 // Update is called once per frame

 void Update () {

  

 }

    private void OnCollisionEnter2D(Collision2D other) {

        // 타일은 제거하지 않는다.

        if (other.gameObject.name != “tile1”) {

            // 주인공과 닿은 오브젝트를 파괴한다.

            Destroy(other.gameObject);

        }

    }

}

유니티는 태그 라는 개념을 제공함.

서로 다른 오브젝트라고 하더라도 태그를 동일하게 입력하여 분류할 수 있다.

(1) 하이어라키 뷰의 Monster 1을 복사하여 Monster 2를 만들자.

(2) 인스펙터 뷰 상단의 Tag 값을 Monster 로 지정한다.

(3) 코드를 아래와 같이 작성한다.

 private void OnCollisionEnter2D(Collision2D other) {

        // 타일은 제거하지 않는다.

        if (other.gameObject.tag == “Monster”) {

            // 주인공과 닿은 오브젝트를 파괴한다.

            Destroy(other.gameObject);

        }

    }

 

* OnMouseDown

(1) OnMouseDownTest 이라는 이름의 C# 스크립트 파일을 생성한다.

(2) 스크립트 파일(컴포넌트)를 몬스터 1(당근 캐릭터)에게 add 한다. (Add Component)

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class OnMouseDownTest : MonoBehaviour {

 // Use this for initialization

 void Start () {

  

 }

 

 // Update is called once per frame

 void Update () {

  

 }

    private void OnMouseDown() {

        Instantiate(gameObject);

    }

}

OnCollisionEnter2D : 충돌이 발생했을 때

OnCollisionStay2D : 충돌 상태가 유지되고 있을 때

OnCollisionEixt2D : 충돌 상태가 끝났을 때

OnMouseDown : 마우스 클릭이 발생했을 때

OnMouseOver : 마우스를 클릭 중일 때

OnMouseUp : 마우스 클릭이 끝났을 때