게임/개발

|유니티| 2 | 유니티 스크립트 (C# 문법) & 카메라가 오브젝트 따라가게 하기 & 밤낮 표현하기 (Light 회전)

no title

C# 문법

컴포넌트 직접 구현

컴포넌트는 C#을 이용해서 구현한다.

1. C# 변수 선언

//type
    //정수
int age = 24;
    //부동 소수는 항상 뒤에 f를 붙여준다
float height = 176.8f;
string myName = "상준";

2. C# 변수 계산

//사칙연산 + - * /
int a = 1; a++; 
string a = "My"; string b = "Name";
a + b; //MyName

3. C# script 만들기

3-1.스크립트 생성

1. 프로젝트 창에서 우클릭
2. Create -> C# script 

3-2.스크립트 내용

//유니티 콘솔창에 메세지 띄우기 
    //단 대소문자 구분 잘하자
Debug.Log(); //유니티 전용
Console.WriteLine(); //C# 전용

4. C# 클래스와 메소드

기본 메소드


다음 메소드가 바로 C에서 main에 해당하는 메소드다
실질적으로 모든 메소드는 다음 메소드 내부에 있어야 작동된다.

void Start(){} //스타트 메소드
void Update(){} //스타트 메소드

컨벤션

메소드는 첫글자 대문자 변수는 카멜 표기

추가 메소드

void Start(){} //스타트 메소드
void Update(){} //스타트 메소드
void TestMethod(){} //이 메소드는 자동시작이 되지 않는다
//따라서 main 메소드에 넣어줘야한다

5. C# 멤버변수 지역변수

  1. 멤버변수
    • 메소드 바깥에 선언
  2. 지역변수
    • 메소드 내부에 선언

6. Transform API

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

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

transform.position.x;
transform.position.y;
transform.position.z;

Component 컴포넌트 클래스

7. if else 조건문 & bool

유니티에서 공이 특정 높이가 넘어갈때
특정 메세지를 출력하게하자`

public class BallPosition_print : MonoBehaviour
{
    float startPos;
    float curPos;
    // Start is called before the first frame update
    void Start()
    {
           startPos = gameObject.transform.position.y;
    }
    bool overTheLine = true;
    // Update is called once per frame
    void Update()
    {
        curPos = gameObject.transform.position.y;
        //높이가 3보다 작아지면 오버더 라인 출력
        if(((startPos - curPos) >= 3.0f) && overTheLine){
            overTheLine = false;
            Debug.Log("overTheLine" + (startPos - curPos));
        }
    }
}

C# 장애물 만들기

8. 장애물 만들기

transform.position의 자료형

transform.position = new Vector(a,b,c);

형변환에 주의하자

    void Update()
    {
        if(cylPos < -1.5f){
            cylSpeed = (0-cylSpeed);
        }
        else if(cylPos > 1.5f){
            cylSpeed = -cylSpeed;
        }   
        this.transform.position = new Vector3(-1,0,(float) (cylPos+=cylSpeed));
    }

의문점

    void Update()
    {
        if(cylPos < -1.5f){
            cylPos += cylSpeed);
        }
        else if(cylPos > 1.5f){
            cylPos -= cylSpeed;
        }   
        this.transform.position = new Vector3(-1,0,(float) (cylPos));
    }

주의점

위의 화살표는 Move 툴의 (기즈모)Gizmo라고 한다.

다음것들은 서로 다른것이다
Gizmo != transform.position._

그럼 기즈모를 조작하는 방법이 있을까?

자주 쓰이는 클래스와 매서드

9. GetComponent

스크립트에서 컴포넌트는 어떻게 사용하나?

script : 코드 파일
컴포넌트 : 인스펙터 창에서 오브젝트의 상태, 정체성을 나타내주는 것 이라생각

코드에서 만약 이 콜라이더가
RigidBody가 중력이 있는지 없는지 확인하고 싶다.

GetComponent 문법

1. Rigidbody
//클래스 ___=GetComponent<클래스>().클래스멤버;
//GetComponent의 경우 컴포넌트로 접근을 하여 값을 받아옵니다.
    //단, 전역에는 선언이 안된다.. 이건 C#에 대해 더 연구해야한다.
    //꼭 스타트 영역에서 선언?
 Rigidbody myRigid;
    // Start is called before the first frame update
    void Start()
    {
        myRigid = gameObject.GetComponent<Rigidbody>();
        Debug.Log("is Using Gravity" + myRigid.useGravity);
    }    

다음과 같은 결과를 얻는다.

2. SphereCollider
//점차 공의 물리 범위가 커지는것
 SphereCollider myColliderRadius;
    // Start is called before the first frame update
    void Start()
    {
        myColliderRadius = gameObject.GetComponent<SpherCollider>();
        myColliderRadius.radius += 0.05; 
    }    

10. GameObject

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

역할

GameObject class

1.게임오브젝트 선택, 탐색

  • 선택 : player = GameObject.Find("MainHeroCharacter");
  • 삭제 : Destroy(this) //“this”는 게임 오브젝트 아님
  1. 오브젝트 활성화
    • GameObject.SetActive(bool)
  2. 오브젝트 정적,동적
  3. 태그와 레이어
    1. 태그 : Tag는 개체 찾을때 사용.
      • 게임 오브젝트 에 할당할 수 있는 레퍼런스 단어입니다
      • 캐릭터에 “Player”를, 플레이어가 조작하지 않는 캐릭터에 “Enemy” 태그를 붙일 수 있습니다.
      • 태그는 콜라이더 조작 스크립트 트리거에 유용합니다.
        예를 들어 플레이어가 적, 사물 또는 수집품과 상호 작용하는지 판단해야 합니다.
    2. 레이어 : 게임 오브젝트,텍스쳐를 번들로 묶는 그룹
      • 랜더링 순서를 컨트롤
      • 충돌 여부설정 가능 layer Collision Matrix
  4. 컴포넌트 추가 삭제
    • Rigidbody rb = GetComponent<Rigidbody>();
    • 다른 게임 오브젝트의 컴포넌트 액세스 인스펙터 표시
    • public GameObject ___;

카메라가 특정 오브젝트를 따라가게 해보자

Part1
GameObject ___= GameObject.Find("_게임오브젝트");

 void Update()
    {
        gameObject.transform.position = new Vector3( 
            0, 
            ball.transform.position.y + 3
            , ball.transform.position.z - 14
        );
    }
Part2
GameObject ball;
    // Start is called before the first frame update
    void Start()
    {
        ball = GameObject.Find("Ball");
        transform.rotation = Quaternion.Euler(new Vector3(30f, -30f, 0.0f));
    }
    // Update is called once per frame
    void Update()
    {
        transform.position = new Vector3(
            ball.transform.position.x + (5 * Mathf.Cos(Mathf.PI/6 * 5) * Mathf.Sin(-Mathf.PI/6)),
            ball.transform.position.y + 5 * (Mathf.Sin(Mathf.PI/6 * 5)),
            ball.transform.position.z + 5 * (Mathf.Cos(Mathf.PI/6 * 5)) + (Mathf.Cos(Mathf.PI/6 * 5) * Mathf.Cos(-Mathf.PI/6)) 
            );
    }

자주쓰이는 클래스 메서드 2 & 밤낮 표현하기

11. Transform

트랜스폼(Transform) 은 게임 오브젝트의 포지션, 회전, 스케일, 부모-자식 상태를 저장

부모 자식관계

어떤 게임 오브젝트가 다른 게임 오브젝트의 부모 일 경우,
그 자식 게임 오브젝트는 부모 오브젝트가 이동, 회전, 스케일할 때 정확히 동일하게 동작합니다.
부모-자식 관계는 사람의 몸과 팔 사이의 관계와 비슷하다고 볼 수 있습니다.

다음은 부모-자식

12. Vector와 Quaternion

벡터와 오일러 각에 대해 공부해야할듯 

Vector3

13. Gizmos 및 Handles

Gizmos 및 Handles 클래스를 사용하면 씬 뷰와 게임 뷰에 라인과 모양뿐만 아니라 인터랙티브 핸들과 컨트롤도 그릴 수 있습니다.

이 기즈모는 플레이어를 보거나 플레이어의 소리를 들을 수 있는 영역을 나타낼수 있음

14. Time

유니티로 부터 시간 정보를 받을 때 사용하는 인터페이스를 나타냅니다.

1. Time.captureFramerate

디스플레이되는 최대 호출 간격 즉, 프레임을 변경시킬수 있음

2. Time.deltaTime

매 프레임마다 어떤 값을 더하거나 빼는 계산을 하는 경우에, Time.deltaTime과 곱해서 사용할 수 있습니다.

// 초당 10미터 음직이고 싶은 경우
void Update() {
        float translation = Time.deltaTime * 10;
        transform.Translate(0, 0, translation);
    }
초당 태양이 음직이게 해보자
public float inputSpeed;
void Update()
{
    transform.Rotate(Vector3.right, (inputSpeed) * Time.deltaTime);
}

3. Time.realtimeSinceStartup

게임이 시작된 시간으로부터 경과한 실제 시간을 나타내며, 단위는 초를 사용합니다. (읽기전용)

4. Time.time

선언된 시점에서 카운트가 시작된다.