본문 바로가기

Unity

[Unity] ⭐️유니티 용어 및 메서드 모음⭐️

728x90
반응형

클래스와 상속

CreatedClass name = new CreatedClass();

접근제한자

 ·  public: 클래스 외부에서 멤버에 접근

 ·  private: 클래스 내부에서만 멤버에 접근

 ·  protected: 클래스 내부와 파생 클래스에서만 멤버에 접근

 

기본적으로 명시가 없을 때에는 private 접근 제한자가 기본값이다.

  Time 클래스

[Time.deltaTime]

 ·  Update() 실행 사이의 시간 간격이며 프레임의 주기이자 초당 프레임의 역수이다.

 ·  Time.deltaTime에는 이전 프레임과 현재 프레임 사이의 시간 간격이 자동으로 할당된다.

 

어떤 변수에 Time.deltaTime를 누적하면 특정 시점으로부터의 시간이 얼마나 흘렀는지 알 수 있다. 특정 초당 특정 반복 횟수를 설정하려면 아래와 같이 코드를 작성한다.

 

transform.Rotate(0f, rotateSpeed*Time.deltaTime, 0f);
혹은
transform.Rotate(new Vector3(x,y,z)*Time.deltaTime);

[Time.fixedDeltaTime]

FixedUpdate는 물리 갱신 주기에 맞춰 실행되는 내장 함수로, Time.fixedDeltaTime이 물리 정보의 갱신 주기를 사용하는 것과 같다.

유니티 내부에서는 FixedUpdate() 내부에서 Time.DeltaTime에 접근할 경우 자동으로 Time.fixedDeltaTime의 값으로 출력한다.

 

 · FixedUpdate: 물리 갱신 주기에 맞춰 실행되는 내장 함수(Time.fixedDeltaTime)

▶ PlayerPrefs

 중요

PlayerPrefs는 플레이어 설정의 줄임말로 게임 세션 간의 플레이어 기본 설정을 저장하는 클래스이다. 문자열, 부동 소수점 및 정수 값을 사용자의 플랫폼 레지스트리에 저장할 수 있다.

 

float PlayerValue = PlayerPrefs.GetFloat("Value");
GetFloat 환경설정 파일에 키가 있는 경우 키에 해당하는 값을 반환한다.
SetFloat  주어진 키로 식별되는 기본 설정의 부동 소수점 값을 설정한다
PlayerPrefs.GetFloat
사용하여 값을 검색할 있다.

PlayerPrefs.GetFloat 메서드를 이용해 새로운 변수를 생성하고 값을 초기화하거나 PlayerPrefsSetFloat 메서드로 Value라는 키로 데이터를 저장한 후 GetFloat 메서드로 꺼내 쓸 수 있다. PlayerPrefs클래스는 float형 말고도 int형이나 string형을 저장할 수 있다.

자세한 사항은 위의 링크를 확인하자.

Animator

 애니메이터는 애니메이션 시스템을 제어하는 ​​인터페이스이다.

전이의 조건은 애니메이터 컨트롤러의 파라미터를 사용해 구성한다. 파라미터의 종류는 int, float, bool, Trigger가 있다.

private Animator animator;

/*Start() 메서드*/
animator = GetComponent<Animator>();
animator.SetBool("유니티_전이변수_이름",C#_스크립트_변수이름);

위의 코드에서 볼 수 있듯 참조 선언된 애니메이터 변수는 유니티 전이 변수의 값을 바꿀 수 있다.

 

SetBool(string name, bool value);

 

게임에서 플레이 캐릭터의 사망 상태가 필요할 경우에는 트리거 파라미터를 변경해야 한다.

캐릭터의 사망 상태의 전이 변수는 Trigger를 가지는 이유는 오른쪽 링크를 확인한다. <링크>

 

animator.SetTrigger("트리거 파라미터");

 

이때 트리거 파라미터는 유니티 상에서 정의된 파라미터의 정의된 '이름'을 말한다.

 

 주의

특정 조건을 만족했을 때 애니메이션의 상태를 바꾸기 위해 파라미터의 값을 변경하는 것을 잊지 않도록 주의한다.

자동 호출 함수

유니티에서 스크립트를 작성하고, 컴포넌트로 등록하여 사용할 때, 가장 기본이 되는 자동으로 일정 시점에서 호출되는 함수들이 있다.

그 함수로는 Awake(), Start(), Update(), FixedUpdate(), OnEnable(), OnDisable() 등이 있다.

 

각각의 함수의 설명은 아래 표와 같다.

 

Awake()  해당 스크립트가 등록된 오브젝트(&스크립트)가 최초로 활성화될 때 불리는 함수입니다. (한번만 호출됨)
Start()  Awake()와 마찬가지로 최초로 활성화될 때 한번만 불리는 함수입니다. (Awake보다는 늦게 호출됨)
Update()  활성화 상태일 때 한 프레임에 한번씩 호출되는 함수입니다.
 (게임 프레임 1초에 60프레임이 나온다면 1초에 60번, 80fps라면 80번 호출)
FixedUpdate()  Update()와 마찬가지로 활성화 상태일 때 지속적으로 호출되지만, 1초에 고정된 횟수만큼 호출합니다.
 (따로 설정하지 않았다면 기본 물리시간인 0.02초에 한번씩 호출됩니다.)
OnEnable() 활성화 될 때마다 호출되는 함수입니다.(Awake/Start와 달리 활성화 될 때마다)
OnDisable()  비활성화  때마다 호출되는 함수입니다.(스크립트든 오브젝트든)

[ OnEnable() 메서드]

· 게임 오브젝트가 활성화될 때마다 상태를 리셋하는 기능을 구현할 때 주로 사용된다.

· 해당 메서드에 초기화 코드를 넣어놓고 게임 오브젝트를 리셋해야 할 때 게임 오브젝트를 켜고 끄는 방식(활성화될 때 리셋)을 활용한다.

 

활용 코드는 아래의 [더보기]를 참고한다.

더보기
private void OnEnable() {
    // 발판을 리셋하는 처리
    for(int i=0;i<obstacles.Length;i++){
        if(Random.Range(0,3) == 0)
            obstacles[i].SetActive(true);
        else 
            obstacles[i].SetActive(false);
    }
}

Hiertarchy (하이어라키 창)

 Camera 설정

[카메라 위치]

· 하이어라키 창 > Main Camera 게임 오브젝트 선택

· Main Camera의 위치를 (x, y, z) 설정 및 회전 설정

 

[카메라 배경]

· Main Camera 게임 오브젝트의 카메라 컴포넌트에서 Clear Flags > Solid Color

· Backgroud의 컬러 필드의 컬러 변경

 

Clear Flags 큐브맵의 빈 배경 영역을 채울 방법을 지정하는 옵션. 옵션은 Skybox 및 Solid Color이다.

UI 설정하기 

Scene > 2D 설정 : 텍스트 생성 확인 위함

하이어 라키> Create > UI > Canvas

Canvas > Legacy > Text

[ 오버플로우 ] : 글자의 크기 및 글자 수 정하기

표시할 글자 크기가 너무 크거나 표시할 글자 수가 너무 많으면 글이 글상자를 넘치게 되는 오버플로우가 발생하게 된다. 

이때 텍스트 컴포넌트의 수평 오버플로수직 오버플로는 글이 글 상자를 넘칠 경우 해당 방향으로의 글자를 잘라낼 것인지 혹은 그대로 넘치게 표시할 것인지 결정한다.

 

수평 오버플로
(Horizontal)
기본 값인 래핑(wrap)은 글자가 수평 방향으로 글 상자를 넘칠 때 강제로 줄 바꿈을 적용하며, 오버플로를 적용하면 수평 방향으로 글상자를 넘친 글이 줄바꿈을 하지 않고 표시한다.
수직 오버플로
(Vertical)
기본값인 자르기(Truncate)는 글자가 수직 방향으로 글 상자를 넘칠 때 넘친 글자들을 잘라낸다. 오버플로를 적용하면 수직 방향으로 글 상자를 벗어난 글들을 잘라내지 않고 그래도 표시한다.

[ 그림자 효과 ]

· Text 게임 오브젝트에 Shadow 컴포넌트 추가(UI > Effect > Shadow)

[ UI 관련 라이브러리 ]

using UnityEngine.UI;
using UnityEngine.SceneManagement;

SceneManager.LoadScene("Scene") 메서드

· 직전까지의 씬을 파괴하고 다시 로드할 씬을 다시 로드한다.

· SceneManagemer 라이브러리와 LoadScene 메서드에 대한 설명은 위의 링크를 참고한다.

🌟🌟🌟🌟🌟 중요 🌟🌟🌟🌟🌟

플레이하고 있는 대상의 상호 작용으로 UI에 변화를 주기 위해서는 플레이어의 스크립트에서 GetComponent 메서드를 이용해 게임 매니저 스크립트에서 참조한 후 상호 작용 코드를 실행해야 한다!

SceneManager.GetActiveScene()

SceneManager.LoadScene(SceneManager.GetActiveScene().name);

 

SceneManager.GetActiveScene() 메서드는 현재 활성화된 씬의 정보를 Scene 타입으로 오브젝트로 가져오는 메서드이다. 그리고 Scene 타입의 오브젝트는 씬의  이름을 변수 name으로 제공한다.

 

즉, SceneManager.GetActiveScene().name은 현재 씬의 이름을 가져온 것이다.

Project (프로젝트 창)

 Material

머티리얼은 셰이더 오브젝트에 대한 레퍼런스를 포함한다. 해당 셰이더 오브젝트가 머티리얼 프로퍼티를 정의하는 경우 머티리얼에는 컬러 또는 텍스처 레퍼런스와 같은 데이터도 포함될 수 있으며  Material 클래스는 C# 코드에서 머티리얼을 나타낸다.

 

 · 새 머티리얼 에셋을 생성:  메인 메뉴 또는 Project 메뉴에서 Assets > Create > Material

 · 머티리얼 에셋에 셰이더를 할당하려면 인스펙터 창에서 Shader 드롭다운 메뉴를 사용한다.

 

알베도(Albedo)는 물체 표면의 기본색을 결정하며 컬러 창에서 RGB를 변경하여 색을 조절한다.

using 키워드

using 키워드를 이용하여 라이브러리의 경로를 지정하면 해당 라이브러리의 코드를 가져오며, using 메서드를 이용해 가져올 수 있는 라이브러리는 아래 코드를 통해 확인할 수 있다.

ex) Mathf 클래스는 게임 및 앱 개발에 일반적으로 필요한 삼각 함수, 로그 함수, 기타 함수를 비롯한 일반적인 수학 함수 컬렉션을 제공한다.

연산자

new

클래스로부터 인스턴스를 생성한다. 다시 말해 어떤 클래스를 상속한 오브젝트를 생성한다.

클래스의 기본 생성자는 초기화에 별다른 입력을 받지 않는다.

 

newClass newValuenew newClass();

Vector3

벡터는 방향과 크기를 설명할 수 있는 기본적인 수학적 개념으로, 게임과 앱에서 벡터는 캐릭터의 포지션, 오브젝트의 이동 속도 또는 두 오브젝트 간 거리와 같은 기본적인 프로퍼티를 설명할 때 자주 사용된다.

유니티 < Vector3 함수>는 왼쪽 하이퍼링크를 참고한다.

 

기본적인 함수는 아래와 같다.

 

Angle 벡터 사이의 각도를 계산 Normalize 벡터의 크기가 1인 벡터를 생성
Cross 두 벡터의 외적을 계산 OrthoNormalize 벡터를 정규화하고 서로 직교하게 생성
Distance a와 b 사이의 거리를 계산 Scale 두 벡터를 구성 요소별로 곱함
Dot 두 벡터의 내적을 계산 Reflect 법선에 의해 정의된 평면서 벡터를 반사
Max / Min 두 벡터의 가장 큰/작은 요소를 반환 RotateTowards current방향으로 벡터를 회전함

Quaternion

쿼터니언은 3차원 방향을 저장하는 클래스로 한 방향에서 다른 방향으로의 상대적 회전을 설명하는 데에도 사용된다.

Unity의 Quaternion 클래스에는 오일러 각도를 전혀 사용하지 않고도 회전을 생성하고 조작할 수 있는 다양한 함수가 있으며, 이러한 함수는 가장 일반적인 경우에 사용해야 한다. 

 

기본적 함수는 아래와 같다.

 

Euler z축을 중심으로 z도, x축을 중심으로 x도, y축을 중심으로 y도 회전하는 회전을 반환합니다. 
Angle 두 회전 a와 b 사이의 각도를 도 단위로 반
eulerAngles 회전의 오일러 각도 표현을 반환하거나 설정

컴포넌트

Rigidbody

리지드 바디 컴포넌트는 물리 기능을 제공하며, 힘을 주는 기능인 AddForce을 가지고 있다.

✔︎ 사용 전에 오브젝트가 2D인지 3D인지 확인한다.

/*public class 내*/
public Rigidbody myRigidbody;
void Start(){
    myRigidbody.AddForce(0,500,0);
}

리지드바디를 제어하기 위해 기본적으로 스크립트를 사용하여 힘이나 토크를 추가한다. 이 작업은 AddForce()와 AddTorque()를 리지드바디의 오브젝트에 호출해야 합니다. 물리를 사용할 때는 오브젝트의 트랜스폼을 직접 변경하면 안 된다는 사실을 기억해야 한다.

이때 AddForce는 (x, y, z) 방향으로 입력한 값만큼 힘을 준다.

[Rigidbody의 제약 설정]

① Rigidbody 컴포넌트 생성

② 인스펙터 창 > Rigidbody 컴포넌트의 Constraints

 Freeze Position / Freeze Rotation  체크 (체크하는 쪽의 축이 고정됨)

 

Rigidbody Constraints Freeze Position  위치 고정
 Freeze Rotation  회전 고정

[Rigidbody의 중력 무시] Use Gravity 해제

리지드바디 컴포넌트는 중력의 영향을 받아 아래로 떨어지는데 Use Gravity 칸을 체크 해제하면 중력을 무시할 수 있다.

[Rigidbody의 이동 속도 설정] : AddForce 이용

public Rigidbody PlayerRigid;
public float speed = 8f;
//update 함수
PlayerRigid.AddForce(speed,0,0);

[Rigidbody의 이동 속도 설정] : Vector 이용

//update 함수 내
float xInput = Input.GetAxis("Horizontal");
float yInput = Input.GetAxis("Vertical");

float xSpeed = xInput*speed, zSpeed = yInput*speed;
Vector3 newVel = new Vector3 (xSpeed,0f,zSpeed);
PlayerRigid.velocity = newVel;

[Rigidbody 컴포넌트를 코드에서 할당하기]

리지드바디 컴포넌트를 코드에서 할당하지 않으면 유니티의 인스펙터 창에서 직접 할당해야 한다. 이러한 과정은 정확은 하지만 번거롭고 할당할 대상이 많을 경우 오히려 헷갈리게 만드는 요소가 될 수 있다. 이러한 문제점을 해결하기 위해서는 코드에서 리지드바디 컴포넌트를 할당하면 된다.

 

PlayerRigid = GetComponent<Rigidbody>();

Rigidbody.Velocity

강체의 속도 벡터이며 Rigidbody 위치의 변화율을 나타낸다.

대부분의 경우 속도를 직접 수정하면 비현실적인 동작이 발생할 수 있으므로 대신 AddForce를 사용하는 것이 좋다.

모든 물리 단계마다 객체의 속도를 설정 시에는 비현실적인 물리 시뮬레이션이 발생하게 된다.

/*Start()*/
rb = GetComponent<Rigidbody>();
/*other F*/
rb.velocity = new Vector3(0, 10, 0); // 3차원 벡터: 3차원 게임
rb.velocity = Vector2.zero; // 2차원 벡터 : 2차원 게임

Rigidbody.MovePosition

이동할 Vector3의 위치를 입력받고 해당 위치로 이동하는 메서드이다.

(ex) playerRigidbody.MovePosition(playerRigidbody.position + moveDistance);

 

이때 tansform 컴포넌트를 이용해도 되나,tansform컴포넌트는 물리처리를 무시하고 실행하기 때문에 예상치 못한 버그가 발생할 수 있다. 따라서 상대 위치를 변경하고자 하는 경우는 리지드바디의 MovePosition메서드를 사용하여 물리처리를 실행하여 사고를 방지한다.

Transform

트랜스폼 컴포넌트는 씬 속 각 오브젝트의 Position, Rotation  Scale을 결정하며 모든 게임 오브젝트에는 트랜스폼이 있다.

[Rigidbody의 이동 속도 설정] : Transform 이용

BulletRigid = GetComponent<Rigidbody>();
BulletRigid.velocity = transform.forward * speed;

위의 코드에서 볼 수 있듯 transform 컴포넌트를 이용해 게임의 앞쪽 방향을 알아내 속도를 설정할 수 있다.

이때 컴포넌트의 Transform과 변수인 transform을 혼동하지 않도록 주의하자.

[transform.LookAt]

transform.LookAt() 메서드를 사용하여 참조하는 변수가 괄호 안의 변수를 보도록 설정한다.

 

objectPrefab.transform.LookAt(target);

[transform.Rotate]

Rotator 메서드는 인자로 X, Y, Z 축에 대한 회전 값을 받고, 현재 회전 상태에서 입력된 값만큼 상대적으로 더 회전한다.

 

transform.Rotate(float xAngle,float yAngle,float zAngle);
혹은
transform.Rotate(new Vector3(float xAngle,float yAngle,float zAngle)*Time.deltaTime);

Udate 메서드가 실행될 때마다 매 프레임마다 인자로 받은 값만큼 회전한다. 이때 Rotator 메서드는 한 프레임에 인자 값만큼 회전한다는 점에 주의하자. 따라서 우리가 원하는 주기로 설정하기 위해선 시간 간격을 고려해야 한다.

[transform.Translate]

오브젝트의 평행이동을 다루는 메서드로 Vector 값을 인자로 받는다.

 

transform.Translate(new Vector3(0,1,0)*Time.deltaTime);

 GetComponent

[컴포넌트 가져오기]

GetComponent() 메서드는 원하는 타입의 컴포넌트를 자신의 게임 오브젝트에서 찾아오는 메서드이다.

게임 오브젝트에서 컴포넌트를 가져오기 위해서는 다음과 같은 형식으로 새로운 컴포넌트를 생성하고 GetComponent 메서드를 사용하여 연결한다.

 

(가져올 컴포넌트 이름) 새로 생성한 컴포넌트 이름 = other.GetComponent<가져올 컴포넌트 이름>();

위 코드를 살펴보면, 게임 오브젝트에서 컴포넌트를 가져오는 것이므로 새로 생성할 컴포넌트도 가져올 컴포넌트를 따르며 other에 참조하여 생성함에 주목하자. 이때 other은 예시로 사용한 것으로 트리거 충돌에서 인자로 받을 수 있다.

Collider

·  게임 오브젝트와 컴포넌트를 충돌 종류에 따라 OnTriggerEnter 혹은 OnCollisionEnter 메시지를 받는다.

 

OnCollisionEnter 계열(일반 충돌): 충돌한 두 콜라이더는 서로 통과하지 않고 밀어냄

OnTriggerEnter 계열(트리거 충돌): 충돌한 두 콜라이더는 서로 통과하여 지나감

 

⭐️⭐️⭐️⭐️⭐️

위의 함수사용자 함수가 아닌 충돌을 감지하는 유니티 내의 함수로 대문자 혹은 철자를 잘못 썼을 경우 오류를 유발할 수 있다.

[이벤트 발생]

OnCollisionEnter 계열: 일반 충돌 OnCollisionEnter(Collision collision) 충돌한 순간
OnCollisionStay(Collision collision) 충돌하는 동안
OnCollisionExit(Collision collision) 충돌했다가 분리되는 순간
OnTriggerEnter 계열: 트리거 충돌 OnTriggerEnter(Collider other) 충돌한 순간
OnTriggerStay(Collider other) 충돌하는 동안
OnTriggerExit(Collider other) 충돌했다가 분리되는 순간

OnCollision계열의 메서드가 실행되면 Collision 타입으로 정보가 들어오며 게임 오브젝트의 충돌 지점, 방향을 알 수 있다. 반면 OnTrigger 계열의 메서드가 실행되면 Collider 타입으로 입력받는다. 자세한 변수는 두 타입의 링크를 확인하자.

 

오브젝트의 트리거 충돌 시에는 Collider타입의 other변수를 가지는데 이는 충돌한 대상을 의미하며 other의 태그를 확인하여 충돌 대상을 확인할 수 있다. 이때 other.tag로 참조한다. 이때 태그(tag)는 게임 개체를 식별하는 사용될  있으며 태그는 사용하기 전에 태그 및 레이어 관리자에서 선언되어야 한다.

일반 충돌: Collision

일반 충돌의 경우 두 콜라이더는 서로 통과하지 않는다. 이때 두 콜라이더가 붙었다 떨어지는 순간을 나눠서 판단하면 충돌 시에 발생하는 함수의 매개 변수를 초기화할 수 있다.

//예시
private void OnCollisionEnter2D(Collision2D collision) {
   if (collision.contacts[0].normal.y > 0.7f){
   //GetContacts[0]: 여러 충돌 지점 중 첫 번째 충돌 지점의 정보
   //절벽이나 천장을 바닥으로 인식하지 않도록 함.
        isGrounded = true;
        jumpCount = 0;
    }
}

private void OnCollisionExit2D(Collision2D collision) {
   isGrounded = false;// 바닥에서 벗어났음을 감지하는 처리
}

 

이때 OnCollision 계열의 충돌 이벤트 메서드는 여러 충돌 정보를 담는 Collision 타입의 데이터를 입력받는다고 위에 언급했다.

Collision 타입은 충돌 지점들의 정보를 담는 ContactPoint 타입의 배열을 contants 배열 변수로 제공한다.

 

collision.contacts[0].normal.y 여러 충돌 지점 중 첫 번째 충돌 지점의 정보를 가져온 것
collision.contacts[0].normal.y 충돌 지점에서의 충돌 표면의 방향인 노말 벡터

 

💫💫💫

2D Collision 충돌에서 contacts 값을 검사함으로써 '절벽'이나 '천장'을 바닥으로 인식하지 않도록 한다!

트리거 충돌

트리거 충돌 시(OnTriggerEnter)에 충돌한 대상의 태그를 확인하고 그 대상의 태그가 사용자가 원하는 태그를 가질 때, 충돌한 대상의 스크립트를 가지고 그 스크립트 내의 함수에 참조로 접근할 수 있다.

void OnTriggerEnter(Collider other){
    if(other.tag == "Player"){
        PlayerControl BtoP = other.GetComponent<PlayerControl>();
        if(BtoP != null){
            BtoP.Die();
        }//BtoP : Bullet to Player
    }
}

 

2D 게임의 경우에는 아래와 같이 2D를 선언함에 주의하자.

/*예시*/
void OnTriggerEnter2D(Collider2D other){
    if(other.tag == "Dead" && !isDead){ Die();}
}

audio 컴포넌트

오디오 소스 컴포넌트 게임 오브젝트에 소리를 낼 수 있는 능력을 부여한다.

 

public AudioSource playerAudio

 

오디오 컴포넌트를 입력받을 변수를 선언 후에 GetComponent 메서드를 이용해 참조 선언하고 play() 함수를 통해 재생할 수 있다.

 

오디오 컴포넌트 선언 playerAudio = GetComponent<AudioSource>();
오디오 재생 playerAudio.Play();
오디오 클립 변경 playerAudio.clip = CntClip;
/* Start() 메서드*/
playerAudio = GetComponent<AudioSource>();
playerAudio.Play();
/*다른 함수 내*/
playerAudio.clip = deathClip;
playerAudio.Play();

 

게임 오브젝트(GameObject)

Unity의 GameObject 클래스는  내에 존재할 수 있는 모든 요소를 나타내는 데 사용된다.

이때 중요한 것은 GameObjectgameObject는 다르다!  gameObject는 자신의 게임 오브젝트를 가리키는 변수이다.

gameObject는 자신의 게임 오브젝트를 가리키는 변수

FindObjectOfType() 메서드

FindObjectOfType() 메서드는 <> 기호에 특정 타입을 명시하면 씬에 있는 모든 오브젝트를 검색해 해당 타입의 오브젝트를 가져온다. 이때 검색하는 타입과 일치하는 오브젝트가 없을 시에는 null을 반환한다. FindObjectOfType 메서드와 비슷한 FindObjectsOfType 메서드는 해당 타입의 오브젝트를 모두 찾아 배열로 반환한다.

 

target = FindObjectOfType<HaveToFind>().transform;

<> 기호 안의 컴포넌트(HaveToFind)를 가진 게임 오브젝트의 참조값을 찾아 target 변수에 할당한다. 이때 참조하는 값(ex transform)은 바뀔 수 있다. 혹은 아래와 같이 표현이 가능하다.

 

HaveToFind 생성할 컴포넌트 = FindObjectOfType<HaveToFind>();
target = 생성할 컴포넌트.transform;

 Object.SetActive( ) 메서드: 참조하는 오브젝트를 활성화 또는 비활성화.

[ 프리팹 ]

· 프리 팹은 언제든지 재사용할 수 있는 미리 만들어진 게임 오브젝트 에셋 파일이다. 

· 비슷한 오브젝트를 여러 개 만드는 번거로움을 줄이기 위해 프리 팹을 사용한다.

 

게임 오브젝트를 프리팹으로 만들려면 해당 게임 오브젝트를 하이어라키 창에서 프로젝트 창으로 드래그&드롭한다. 프리팹이 되면 프로젝트의 창의 오브젝트의 이미지가 바뀐다.

Destroy ()

런타임 시점에 컴포넌트를 추가하거나 제거할 수 있으며, 이는 게임 오브젝트를 절차적으로 생성하거나 게임 오브젝트의 동작 방식을 수정할 때 유용하다. 또한 손상을 일으키지 않고 스크립트를 통해 스크립트 컴포넌트와 일부 타입의 빌트인 컴포넌트를 enable 또는 disable 상태로 만들 수 있다.

 

런타임 시점에 컴포넌트를 추가하는 가장 좋은 방법은 AddComponent <Type>를 사용하여 여기에 보이는 것처럼 컴포넌트 타입을 꺾쇠괄호 안에 지정하는 것이며 컴포넌트를 제거하려면 컴포넌트 자체에 대해 Object.Destroy 메서드를 사용해야 한다.

 

Destroy (Object obj, float t= 0.0F);

위에서 볼 수 있듯이 Destroy의 두 번째 값으로 초 단위로 지연 시간을 줄 수 있다.

Instantiate() 메서드

Instantiate() 메서드는 원본 오브젝트를 주면 해당 오브젝트를 복제한 오브젝트를 생성한다. 인자가 오브젝트만 가질 때에는 복제 생성된 게임 오브젝트의 위치와 회전이 임의로 설정된다. 이때 복제하면 모든 하위 객체와 구성 요소도 원본 객체와 같은 속성 세트로 복제된다.

 

Instantiate(원본,위치,회전);

메서드

Update() 메서드

게임은 주기적으로 갱신 처리를 함으로써 플레이어의 위치를 체크하고, 변화하는 정보에 따라 갱신을 실행한다.

Update() 메서드는 Start() 메서드와 같이 특정 시점에 자동으로 실행되는 이벤트 메서드이며 한 프레임에 한 번, 매 프레임마다 반복 실행된다.

Random 메서드

게임에 대한 무작위 데이터를 쉽게 생성하며 정적 변수와 정적 함수를 가진다.

 

 정적 변수 정적 함수
insideUnitCircle, insideUnitSphere, rotation, state, value 등 ColorHSV, InitState, Range 등

[Random.Range]

Range의 괄호 안의 범위에서 무작위를 반환한다. 인자의 입력값에 따라 반환값이 다르다. (ex int형 입력 시 int형 반환)

 

 

RandomVal = Random.Range(Min,Max);

입력관리자

Input Manager 창에서 프로젝트에 대한 입력 축 및 축과 관련된 행동을 정의할 수 있다.

액세스 하려면 Unity의 메인 메뉴에서 Edit > Project Settings로 이동한 후 오른쪽 내비게이션에서 Input Manager를 선택한다.

입력 관리자는 다음 타입의 컨트롤을 사용한다.

 

·  는 W 키, Shift 키, 스페이스바 등과 같은 물리적 키보드의 모든 키를 의미한다.

·  버튼은 리모컨의 X 버튼처럼 물리적 컨트롤러(예: 게임패드)에 있는 버튼을 가리킨다.

·  가상 (복수형) 버튼, 등과 같은 컨트롤에 매핑된다

[ 키 패밀리명명 규칙 ]

문자 키 a, b, c…
숫자 키 1, 2, 3…
화살표 키 up, down, left, right
숫자패드 키 [1], [2], [3], [+], [equals]…
수정 키 right shift, left shift, right ctrl, left ctrl, right alt, left alt, right cmd, left cmd
특수 키 backspace, tab, return, escape, space, delete, enter, insert, home, end, page up, page down
기능 키 f1, f2, f3…

Input.GetKey

· Input.GetKey() 메서드는 키보드의 식별자를 KeyCode 타입으로 받는다.

· 실행될 때 해당 키를 누르고 있으면 true, 아니면 false를 반환한다.

 

Input.GetKey() 메서드의 입력으로 사용하는 KeyCode는 키보드의 키 식별자를 쉽게 가리키기 위한 타입이다. KeyCode 타입은 내부적으로 숫자로 동작한다. 이때 KeyCode는 키보드에 할당된 식별자로 작동하며 숫자로 설정돼 있다

 

[ Input.GetKey ]

- 해당 키를 '누르는 동안' true, 그 외에는 false 반환

 

[ Input.GetKeyDown ]

- 해당 키를 '누르는 순간' true, 그 외에는 false 반환

[ 화살표 입력 따른 입력 확인]

🔼 Input.GetKey(KeyCode.UpArrow)
🔽 Input.GetKey(KeyCode.DownArrow)
▶️ Input.GetKey(KeyCode.RightArrow)
◀️ Input.GetKey(KeyCode.LeftArrow)
if(Input.GetKey(KeyCode.UpArrow)==true){PlayerRigid.AddForce(0,0,speed);}
if(Input.GetKey(KeyCode.DownArrow)==true){PlayerRigid.AddForce(0,0,-speed);}
if(Input.GetKey(KeyCode.RightArrow)==true){PlayerRigid.AddForce(speed,0,0);}
if(Input.GetKey(KeyCode.LeftArrow)==true){PlayerRigid.AddForce(-speed,0,0);}

 Input.GetAxis

Input.GetAxis() 메서드는 어떤 축에 대한 입력값을 숫자로 반환하는 메서드이다. 해당 메서드를 이용하면 관성을 없앨 수 있다!

 

축의 음의 방향으로 대응되는 버튼 입력 -1.0
아무것도 누르지 않음 0
축의 양의 방향으로 대응되는 버튼 입력 +1.0

· Horizontal 축과 Vertical 축의 대응입력키와 출력되는 입력값

 

Horizontal  Horizontal(수평) 축에 대응되는 키 · 음의 방향: ⬅️, A
· 양의 방향: ➡️,D
Input.GetAxis("Horizontal")의 출력값 · 음의 방향: -1.0
· 아무것도 누르지 않음: 0
· 양의 방향: +1.0
Vertical  Vertical(수직) 축에 대응되는 키 · 음의 방향: ⬇️,W
· 양의 방향: ⬆️,S
Input.GetAxis("Vertical")의 출력값 · 음의 방향: -1.0
· 아무것도 누르지 않음: 0
· 양의 방향: +1.0
void Update() {
        // 수평과 수직 축 입력 값을 감지하여 저장
        float xInput = Input.GetAxis("Horizontal");
        float zInput = Input.GetAxis("Vertical");

        // 실제 이동 속도를 입력 값과 이동 속력을 통해 결정
        float xSpeed = xInput * speed;
        float zSpeed = zInput * speed;

        // Vector3 속도를 (xSpeed, 0, zSpeed)으로 생성
        Vector3 newVelocity = new Vector3(xSpeed, 0f, zSpeed);
        // 리지드바디의 속도에 newVelocity를 할당
        playerRigidbody.velocity = newVelocity;
    }

 Input.MouseButton

주어진 마우스 버튼이 눌려져 있는지 여부를 반환한다.

버튼 값은 왼쪽 버튼이 0, 오른쪽 버튼이 1, 가운데 버튼이 2이며 반환은 true마우스 버튼을 눌렀을 때와 놓을 false때이다.

 

 

Input.GetMouseButtonDown 마우스를 누른 프레임 동안 true를 반환 마우스를 눌렀다가 놓고 다시 누를 때까지는 true를 반환 X
Input.GetMouseButtonUp 마우스를 놓는 프레임 동안 true를 반환 마우스를 눌렀다가 다시 놓기 전까지는 true를 반환 X

매 프레임마다 상태가 재설정되므로 Update 함수에서 이 함수를 호출해야 한다.

private void Update() {
    if(Input.GetMouseDown(0)){ }
    else if(Input.GetMouseUp(0)){  }
}

[ 입력 버튼 ]

입력축은 입력값으로 숫자가 반환되는 반면 입력 버튼은 눌렀을 경우 true, 누르지 않을 경우 false를 반환한다.

▷ Fire1

· 입력 매니저에 기본 추가되어 있는 입력버튼으로 좌 Ctrl과 왼쪽 마우스가 할당됨.

랜더러

UnityEngine.CoreModule에 속하는 모든 컴포넌트로 렌더러에 대한 일반 기능이다.

렌더러는 객체를 화면에 나타나게 만드는 것이다. 이 클래스를 사용하여 모든 객체, 메시 또는 파티클 시스템의 렌더러에 액세스 하며 렌더러를 비활성화하여 개체를 보이지 않게 만들 수 있고 자료에 액세스 할 수 있다. 

 

Renderer.positionCoun 정점 수를 설정/가져오며 선의 정점 수를 반환한다. 
Renderer.enabled 활성화된 경우 렌더링된 3D 개체를 표시한다.
Renderer.SetPosition
선의 정점 위치를 설정한다.

더 많은 함수는 오른쪽 링크를 참고한다. [링크]

레이캐스트

레이케스트(Raycast)는 보이지 않는 광선을  쐈을 때 광선이 다른 콜라이더와 충돌하는지 검사하는 처리이다. 이때 보이지 않는 광선을 레이(Ray)라고 하며 Ray 타입으로 레이의 정보만 따로 표현할 수 있다.

 

public static bool Raycast(Vector3 origin, Vector3 direction, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);

 

if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.forward), out hit, Mathf.Infinity, layerMask))

레이케스트를 실행했을 때 레이가 콜라이더를 가진 게임 오브젝트와 충돌하면 RaycastHit 타입으로 충돌 정보가 생성된다.

생성된 RaycastHit 오브젝트를 살펴보면 레이와 충돌한 게임 오브젝트, 충돌한 위치, 충돌한 표면의 방향을 알 수 있다.

메서드 반환 타입 생성 정보
Raycast RaycastHit 레이(ray)와 충돌한 게임 오브젝트, 충돌한 위치, 충돌한 표면의 방향

 

더 많은 정보는 오른쪽 링크를 참고한다. [링크]

 

 

728x90
반응형
댓글