Start(), Update() 함수

  • Start() : 게임 내에서 해당 명령을 한 번만 실행
  • Update() : 해당 명령을 매 프레임마다 실행

개체 이동 : transform.Translate(x, y, z)

  • 게임 개체를 이동하는 명령
    - Start() 함수 내에서 작성 = 게임 내 한 번만 이동
    - Update() 함수 내에서 작성 = 매 프레임마다 입력한 좌표 수만큼 이동 (연속 이동)
  • 소수점이 존재하는 float을 좌표로 입력할 경우, 숫자 뒤에 f를 붙여야 한다.

    *c#에서는 코드의 한 줄이 끝날때마다 ;을 반드시 붙여야 한다.




변수

  • 변수에 할당할 값의 자료형 변수명 = ;




직렬화 : SerializeField

직렬화

  • 특정 객체(데이터)를 바이트의 나열로 바꿔서 파일이나 네트워크통신으로 Stream 가능하게 해주는 것
  • Deserialize(역직렬화) : 직렬화된 바이트의 나열을 원래 객체(데이터)로 바꿔주는 것
  • 즉 바이너리 데이터와 객체 데이터 사이의 인코딩, 디코딩
  • 어떤 데이터를 전송하기 위해 재구성 가능한 형식으로 변환하는 것
  • 이용하던(이용할) 데이터를 재사용/복원 하기 위한 과정
  • 직렬화 방식 : 텍스트 기반 직렬화(JSON Serialization), 바이너리 기반 직렬화
  • 수신자와 송신자가 동일한 프로토콜만 사용하면 어느 방법이든 동일하게 사용 가능
  • 유니티의 경우 스크립트를 직렬화할 때 public 필드만 직렬화가 가능한데, 이 때 private 필드도 직렬화할 수 있게 해주는 것이 바로 SerializeFiled 어트리뷰트
  • 직렬화된 필드는 유니티 에디터의 Inspector에서 정상적으로 표시되며 여기서 간편하게 수정할 수 있다. 그러나 Inspector에서 변경한 변수의 값은 스크립트에 동기화되지는 않으니 주의해야한다.
C# 스크립트Inspector
  • 유니티의 직렬화 조건
    • ‘public’ 또는 [SerializeField] 속성을 가져야 한다.
      class MyClass{ public int serializeNum1;
      // or [SerializeField] private int serializeNum2 }
    • [SerializeField] 속성을 가졌다면 구조체와 class도 가능
    • 구조체의 경우 Unity 4.5버전부터 가능하며, class의 경우는 비추상 클래스여야 한다.
    • static, const, readonly가 아니여야 한다.
    • ‘fieldtype’은 직렬화 할 수 있는 타입이어야 한다.
      • int, string, bool, float 등의 기본타입
      • 직렬화 가능한 배열이나 제네릭()
      • UnityEngine.Object 에서 파생한 오브젝트의 참조




플레이어 입력 : Input.GetAxis()

  • 플레이어의 키보드 조작 가져오는 메소드
  • 플레이어로부터 값을 입력받는 메소드
  • Edit - Project Settings - Input Mangager에서 유니티 Input API로 조정할 수 있는 것과 이들의 조정방법을 볼 수 있다.
controlsdetails




플레이어 속도 : Time.deltaTime

  • 게임을 프레임레이트로부터 독립시켜주는 메소드
  • 빠른 컴퓨터와 느린 컴퓨터에서 똑같이 작동하도록 만들어줌 (컴퓨터가 알아서 계산)



속도 높이기

속도 조절 변수 할당 - 이동 함수 파라미터 값에 곱함 - Inspector에서 조절




Follow Camera : Cinemachine

  • 플레이어의 이동에 따라 카메라가 움직이게 하는 것
  • Cinemachine Documentation
  • 가상 카메라 추가 과정

    1. Window - Package Manager - Cinemachine install
    2. Main CameraInspector에서 Cinemachine Brain component 추가
    3. Cinemachine - Create Virtual Camera로 가상 카메라 생성 (메인 카메라의 브레인으로 추가된 가상 팔로우 카메라)

    4. Virtual Follow CameraInspector 설정
    • Saving During Play : 플레이모드에서 바꾼 설정값을 그대로 반영하고 싶을 때 사용
    • Follow : 플레이어/개체를 고정된 위치에서 따라다님
    • Body - Framing Transposer : 선택한 카메라 프레임 안에 있는 개체를 따라다니면서 찍는 것
    • Camera Distance : 개체와 카메라의 거리 조절

*Game창의 노이즈 제거 : Hierarchy에서 Virtual Follow Camera 선택 해제




기본 충돌 (Collision)

충돌 조건1. Box Collider

  • 물리 충돌 처리를 위한 오브젝트의 형태를 정의
  • 플레이어가 부딪히거나 통과하지 못하는 투명한 결계
  • 종류는 모양에 따라 다양하며 2D와 3D로 나뉨

충돌 조건2. Rigid body

  • 물리 시스템을 이용해 개체에 질량을 부여하여 개체들끼리 서로 부딪히게 만듬
  • 물리법칙에 의해 개체가 날아가지 않도록 Constraints 을 통해 위치와 회전을 고정




메소드(method)

메소드 소개

  • method(=Function)는 코드 블럭을 실행해 게임이 무언가를 하게 만드는 것

  • 실행 방법 : 선언(Declaring) & 부르기(Calling)

    • Function name : type + name (직관적이고 명확한 이름), 아무것도 반환하지 않는다면 void
    • Parameter : 입력받아야하는 매개변수가 있다면 (type + name), 없으면 비워두기
    • code block : {} 안에 실행할 것에 대한 코드 기재
  • 행위를 지시하는 문을 작성할 때는 코드를 반드시 ;로 끝낼 것

  • Start() & Update() -> Callbacks


실습1 : OnCollisionEnter()

무엇인가에 부딪히면 유니티의 콜백(callback) 시스템이 충돌이 일어났을 때의 행동을 지시하는 OnCollisionEnter를 호출한다.

ScriptUnity

실습2 : GetComponent<>()

<> 안의 component를 불러오는 메소드

🔥Warning🔥
Unity에서 script를 적용할 때 반드시 오브젝트의 Inspector에서 component로
추가할 것

ScriptUnity




스코어 증가

  1. c# 스크립트 Scorer 생성
  2. PlayerInspector에 추가(Component 추가)
  3. Visual studio로 코드 편집
//스코어 안내 스크립트 및 코드 추가//

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

public class Scorer : MonoBehaviour
{
    int hits = 0;
    private void OnCollisionEnter(Collision other) 
   {    
        hits++;  //hits = hits + 1;  => 부딪힐 때마다 +1
        Debug.Log("You've bumped into a thing this many times: " + hits);  //부딪힌 횟수 알려주기
   }
  1. Unity에서 확인
  2. 장애물(obstacle) 추가 : Wall를 복붙해 이와 같은 조건의 장애물 만들기




Time.time

// Dropper.cs //

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

public class Dropper : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        Debug.Log(Time.time); //  매 프레임마다 게임 시작으로부터 몇 초가 경과되었는지 알려줌
    }
}




If 구문

  1. 오브젝트가 떨어지는 스크립트 작성
// If문 사용해 오브젝트(Dropper)가 지정시간 이후 떨어지게 하기//

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

public class Dropper : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Time.time > 3)
        {
        	Debug.Log("3 seconds has elapsed");
        }
    }
}
  1. 공중에 떠 있는 오브젝트에 스크립트 부착(Add Component)




참조 캐싱하기

캐싱
: 자주 사용되는 데이터나 정보를 필요할 때 쉽게 접근할 수 있도록 메모리에 저장하는 기술

// 지정 시간 이후에 색,중력 생겨 오브젝트(Dropper) 떨어지게 하기 //

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

public class Dropper : MonoBehaviour
{
    MeshRenderer renderer;
    Rigidbody rigidbody;
    [SerializeField] float timeToWait = 2f;

    // Start is called before the first frame update
    void Start()
    {
        renderer = GetComponent<MeshRenderer>(); // 참조 캐싱
        rigidbody = GetComponent<Rigidbody>();

        renderer.enabled = false; // 떨어지는 오브젝트의 Mesh Renderer 해제 (보이지 않도록 함)
        rigidbody.useGravity = false; // 중력 사용 해제    
    }

    // Update is called once per frame
    void Update()
    {
        if (Time.time > timeToWait)
        {
            renderer.enabled = true; // 떨어지는 오브젝트의 Mesh Renderer ON (보이도록 함)
            rigidbody.useGravity = true; // 중력 사용 
        }
    }
}




태그 사용하기

Player tag

DropperObjectHit.cs스크립트 부착한 후,
Dropper가 떨어질 때 바닥과 부딪힐 때가 아닌 Player와 부딪힐 경우에만
색이 변하게 하기 위해 ObjectHit.cs 코드 수정

  1. 태그 설정
    유니티에서는 각 개체별로 태그를 설정할 수 있다.
    이후 스크립트에서 언급할 경우 정확히 똑같은 철자로 적어줘야 한다.
  2. ObjectHit.cs 코드 수정
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectHit : MonoBehaviour
{
   private void OnCollisionEnter(Collision other) 
   {  
        if(other.gameObject.tag == "Player")
        // other = 부딪힌 물체
        // Player tag의 오브젝트와 부딪힌 경우에만 아래 코드 실행
        {
            GetComponent<MeshRenderer>().material.color = Color.red;
        }
   }
 }


Add Tag

Player와 부딪힌 경우 Tag바꿔주기

  1. Add New Tag : Hit
  2. ObjectHit.cs 코드 추가
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectHit : MonoBehaviour
{
   private void OnCollisionEnter(Collision other) 
   {  
        if(other.gameObject.tag == "Player")
        {
            GetComponent<MeshRenderer>().material.color = Color.red;
            gameObject.tag = "Hit";
            //앞에 아무것도 명시하지 않았으므로 이 스크립트가 부착된 게임 개체에 적용됨
            //해당 개체가 부딪힐 경우 tag가 Hit로 바뀜
        }
   }
}

스코어 제한

한 번 부딪힌 Obstacle은 다시 부딪혀도 더이상 스코어가 추가되지 않도록 제한

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

public class Scorer : MonoBehaviour
{
    int hits = 0;
    private void OnCollisionEnter(Collision other) 
   {    
        if(other.gameObject.tag != "Hit") // 한 번도 부딪히지 않은 경우(not Hit)에만 스코어 추가
        {
            hits++;  //hits = hits + 1;
            Debug.Log("You've bumped into a thing this many times: " + hits);
        }
   }
}




객체 회전시키기

  1. Spinner 개체와 스크립트 생성
  2. Spinner 개체에 ObjectHit, Spinner 스크립트 부착
  3. 객체가 회전하도록 Spinner 스크립트 작성
    ```cs
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Spinner : MonoBehaviour
    {
        [SerializeField] float xAngle = 0;
        [SerializeField] float yAngle = 0;
        [SerializeField] float zAngle = 0;
    
        // Start is called before the first frame update
        void Start()
        {
            
        }
    
        // Update is called once per frame
        void Update()
        {
          transform.Rotate(xAngle, yAngle, zAngle);  
        }
    }
    ```




프리팹 준비하기

  1. Assets 파일 정리
  2. Hierarchy 파일 정리
  3. 프리팹으로 만들 오브젝트 Prefabs 파일에 드래그

*오브젝트 중심축 기준

GlobalLocal




장애물 코스 만들기

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN