#유니티 엔진 #이벤트함수 #라이프사이클

sejun-Lee·2025년 4월 14일

UnityEngine

목록 보기
1/12
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    
        직렬화 (Serialization)
        
        데이터 구조 또는 게임오브젝트 상태를 보관하고 관리하는 기법
        인스펙터 창에서 오브젝트의 직렬화된 멤버변수 값을 보여줌
        이를 이용하여 소스코드의 수정 없이 유니티 에디터에서 값을 변경 가능
     
     <데이터 직렬화>
     오브젝트의 멤버변수 값을 확인하거나 변경
     오브젝트의 멤버변수 참조를 드래그 앤 드랍 방식으로 연결

    [Header("Value")]
     C# Type
    public bool boolValue;
    public int intValue;
    public float floatValue;
    public string stringValue;

     Unity Type
    public Vector3 vector3;
    public Vector3Int vector3Int;
    public Vector2 vector2;
    public Vector2Int vector2Int;
    public Color color;
    public Rect rect;
    public LayerMask layerMask;
    public AnimationCurve curve;
    public Gradient gradient;

     열거형
    public ForceMode mode;
    public enum Tyep { None, Special, Master }
    public Tyep tyep;

     직렬화 가능한 필드의 배열 및 List<T>
    public int[] array;
    public List<int> intList;

    [Header("Reference")]
     Object Type
    public new GameObject gameObject;
    public new Transform transform;
    public new Rigidbody rigidbody;
    public new Collider collider;


     <어트리뷰트>
     클래스, 속성 또는 함수 위에 명시하여 특별한 동작을 나타낼 수 있는 마커
    [Header("Unity Attribute")]

    [SerializeField]
    private int privateValue;   // SerializeField -> private 이지만 에디터 상에선 수정 가능!!

    [HideInInspector]
    public int publicValue;

    [Range(0, 100)]
    public float rate;  // 0~100 조절 바 -> 소리 음량?

    [TextArea(3, 5)]
    public string textField;    // npc 대화 창?? 3~5줄

    [Serializable] // 구조체에 직렬화 가능 속성을 포함
    public struct StructType
    {
        public int value1;
        public string value2;
    }
    public StructType structField;

    [Serializable] // 클래스에 직렬화 가능 속성을 포함
    public class ClassType
    {
        public int value1;
        public string value2;
    }
    public ClassType classField;


    /**********************************************************************************************************/


     변수 : 정보
    public Rigidbody rigid;
    public float junpPower;
    public float movePower;

    
         유니티 메시지 함수
          
         유니티가 보내는 메시지에 반응하는 함수
         MonoBehaviour 클래스에 메시지와 같은 이름의 함수가 반응
         스크립트는 유니티 엔진이 보내는 메시지를 받아 사건 타이밍을 확인
         메시지 함수에서 자신의 행동을 정의하여 기능을 구성
    


     함수 : 기능
    private void Awake()
    {
        // 스크립트가 씬에 포함되었을 때 1회 호출
        // 스크립트가 비활성화 되어 있는 경우에도 호출됨

        // 역할 : 스크립트가 필요로 하는 초기화 작업 진행
        //        (외부 게임상황과 무관한 초기화 작업)

        Debug.Log("Awake");
    }

    private void Start()
    {
        // 스크립트가 씬에 처음으로 Update하기 직전에 1회 호출 (시작할 때 1번)
        // 스크립트가 비활성화 되어 있는 경우 호출되지 않음

        // 역할 : 스크립트가 필요로 하는 초기화 작업 진행
        //        (외부 게임상황이 필요한 초기화 작업)

        Debug.Log("Start");
    }

    private void OnEnable()
    {
        // 스크립트가 활성화될 때마다 호출

        // 역할 : 스크립트가 활성화 되었을 때 작업 진행

        Debug.Log("OnEnable");
    }

    private void OnDisable()
    {
        // 스크립트가 비활성화될 때마다 호출

        // 역할 : 스크립트가 비활성화 되었을 때 작업 진행

        Debug.Log("OnDisable");
    }

    private void Update()
    {
        // 게임의 프레임 처음마다 호출

        // 역할 : 핵심 게임 로직 구현
        Debug.Log("Udpate");

        // 동작중에 계속 호출 됨
        if (Input.GetKey(KeyCode.LeftArrow))    // GetKey -> 누르고 있는동안 입력
        {	// 왼쪽으로 움직이도록 힘을 가함
            rigid.AddForce(Vector3.left * movePower, ForceMode.Force);
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {	// 오른쪽으로 움직이도록 힘을 가함
            rigid.AddForce(Vector3.right * movePower, ForceMode.Force);
        }
        if (Input.GetKey(KeyCode.UpArrow))
        {	// 앞으로 움직이도록 힘을 가함
            rigid.AddForce(Vector3.forward * movePower, ForceMode.Force);
        }
        if (Input.GetKey(KeyCode.DownArrow))
        {	// 뒤쪽으로 움직이도록 힘을 가함
            rigid.AddForce(Vector3.back * movePower, ForceMode.Force);  // Force -> 쭈욱 힘을 주는것
        }

        if (Input.GetKeyDown(KeyCode.Space))    //GetKeyDown -> 눌렀을때 입력 , GetKeyup -> 눌렀다 땠을때 입력
        {	// 위쪽으로 움직이도록 힘을 가함
            rigid.AddForce(Vector3.up * junpPower, ForceMode.Impulse);  // Impulse -> 한번 펑! 힘을 주는 것
        }
    }

    private void LateUpdate()
    {
        // 게임의 프레임 마지막마다 호출
        // 씬의 모든 게임오브젝트의 Update가 진행된 후 호출

        // 역할 : 게임프레임의 진행 결과가 필요한 동작이 있는 기능 구현

        Debug.Log("LateUpdate");
    }

    private void FixedUpdate()
    {
        // 일정한 시간(기본 1초에 50번) 마다 호출
        // Update와 다르게 프레임당 연산과 단위시간이 일정
        // 물리엔진과 같이 게임의 프레임과 무관하게 일정해야 하는 작업에 사용
        // 게임로직 등 연산이 많은 작업을 FixedUpdate에 구현하지 않아야 함

        // 역할 : 물리엔진 작업 진행

        Debug.Log("FixedUdpate");
    }

    private void OnDestroy()
    {
        // 스크립트가 씬에서 삭제되었을 때 1회 호출

        // 역할 : 스크립트가 필요로 하는 마무리 작업 진행

        Debug.Log("OnDestroy");
    }


}
profile
초보 개발자

0개의 댓글