개?발/Unity

유니티 3D 기초(기본개념)

YUEIC 2023. 10. 3. 23:48

게임 오브젝트의 LifeCycle

기본적인 Cycle : 초기화-(활성화)-물리-로직-(비활성화)-해체

아래는 예시

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

public class LifeCycle : MonoBehaviour
{
    private void Awake() {  //게임 오브젝트가 생성될 때 최초실행 == 초기화
        Debug.Log("플레이어 데이터가 준비됨");
    }

    private void OnEnable() {   //게임 오브젝트가 활성화 될 때 실행(최초 실행 x) == 활성화
        Debug.Log("플레이어가 로그인 함");
    }

    private void Start() {  //업데이트 시작 직전 최초실행
        Debug.Log("플레이어의 준비가 끝남");
    }

    private void FixedUpdate() {    //물리연산 업데이트, cpu를 많이 사용    == 물리
        Debug.Log("플레이어가 이동함");
    }

    private void Update() {     //게임 로직 업데이트 (물리엔진 제외), 환경에 따라 실행주기가 변동   ==  게임로직
        Debug.Log("플레이어가 사냥함");
    }

    private void LateUpdate() {     //모든 업데이트가 끝난 후 호출, ex 카메라무빙과 같은 후처리     == 게임로직
        Debug.Log("경험치 획득");
    }

    private void OnDisable() {      //오브젝트가 비활성화 되었을 때  == 비활성화
        Debug.Log("플레이어가 로그아웃 함");
    }

    private void OnDestroy() {      //게임 오브젝트가 삭제될 때, ex 오브젝트가 삭제되기 전 남겨야 할 사항이 있을 때     == 해체
        Debug.Log("플레이어 데이터를 해제");
    }
}

키 입력받기 예제

private void Update() {                 //입력받는 부분은 input class에서 받음
        if(Input.anyKeyDown){               //아무 입력을 최초로 받을 때 true
            Debug.Log("키 입력이 감지 됨.");   
        }
        // if(Input.anyKey){                   //아무 입력을 받으면 ture
        //     Debug.Log("키 입력 중.");
        // }
        // if(Input.anyKeyUp){                   //아무 입력을 받으면 ture
        //     Debug.Log("키 입력이 종료됨.");
        // }

        //입력방식은 Down(입력시 최초) Stay(입력이 지속) Up(입력의 마지막) 으로 구성됨 

        if(Input.GetKeyDown(KeyCode.Return)){   //getKeyDown : 키보드 입력 시작 시 true
            Debug.Log("아이템을 구입하였습니다.");
        }
        // if(Input.GetKey(KeyCode.LeftArrow)){    //getKey : 키보드 입력을 받으면 true
        //     Debug.Log("왼쪽으로 이동 중");
        // }
        // if(Input.GetKeyUp(KeyCode.RightArrow)){     //getKeyUp : 키보드 입력 종료시 true
        //     Debug.Log("오른쪽 이동을 멈췄습니다.");
        // }
        if(Input.GetMouseButtonDown(0)){     //getMouseButtonDwon : 마우스 버튼 입력 시작시 true    (0=왼쪽버튼, 1=오른쪽버튼)
            Debug.Log("마우스 왼쪽 클릭이 감지됨");
        }
        if(Input.GetMouseButton(0)){     //getMouseButton : 마우스 버튼 입력을 받으면 true
            Debug.Log("마우스 왼쪽 클릭 입력중");
        }
        if(Input.GetMouseButtonUp(0)){     //getMouseButtonUp : 마우스 버튼 입력 종료시 true
            Debug.Log("마우스 왼쪽 클릭 종료");
        }

        if(Input.GetButtonDown("Jump")){    //edit - project settings - input manager 에 등록된 키, jump == space bar
            Debug.Log("점프");
        }
        if(Input.GetButton("Jump")){
            Debug.Log("점프 모으는 중");
        }
        if(Input.GetButtonUp("Jump")){
            Debug.Log("높이 점프");
        }

        if(Input.GetButton("Horizontal")){
            Debug.Log("횡이동 중" + Input.GetAxis("Horizontal"));       //증감값이 유리수(가중치)가 적용
            Debug.Log("횡이동 중" + Input.GetAxisRaw("Horizontal"));    //증감값이 정수(1)로 고정
        }
    }

오브젝트 이동 (Vector값 활용)

간단하게 키 입력받아 오브젝트 이동

public class Move : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //오브젝트는 변수 Transform을 항상 가지고 있음
        //translate : 벡터 값을 현재 위치에 더하는 함수
        //Vectorn : 방향과 값을 모두 포함하는 값 == 속도
        //Scalar : 방향을 포함하지 않는 값 == 속력
    }

    private void Update() {
        Vector3 vec = new Vector3(
            Input.GetAxisRaw("Horizontal")*0.01f,
            Input.GetAxisRaw("Vertical")*0.01f,
            0); //vec라는 이름의 vector 변수를 만들고 (?,?,?)으로 초기화
        transform.Translate(vec);          //vec변수의 값으로 오브젝트를 이동
    }
}

함수를 이용하여 오브젝트를 목표까지 이동하기

public class NewBehaviourScript : MonoBehaviour
{
    Vector3 target = new Vector3(10.73f, 2.31f, 0);

    void Update()
    {
        //1.MoveTowards : 등속운동
        transform.position = Vector3.MoveTowards(transform.position, target, 0.1f);     
				//MoveTowards(현재위치, 목표위치, 속도)
        
        //2.SmoothDamp : 부드러운 감속이동 
        Vector3 velo = Vector3.zero;
        transform.position = Vector3.SmothDamp(transform.position, target, ref velo, 1f);  
				//SmoothDamp(현재위치, 목표위치, 참조속도, 속도), 마지막 매개변수(속도)에 반비례하여 속도 증가  ref : 참조 접근 - 실시간으로 바뀌는 값 적용 가능

        //3.Lerp : 선형보간, SmoothDamp보다 감속시간이 김
        transform.position = Vector3.Lerp(transform.position, target, 0.02f);    
				//Lerp(현재위치, 목표위치, 속도), 마지막 매개변수에 비례하여 속도 증가(최대값 1)

        //4.SLerp : 구면 선형 보간, 호를 그리며 이동
        transform.position = Vector3.Slerp(transform.position, target, 0.01f);   
				//Slerp(현재위치, 목표위치, 속도), 마지막 매개변수에 비례하여 속도 증가(최대값 1)
    }
}

DeltaTime

컴퓨터의 연산 처리 속도에 따라 오브젝트가 이동하는데 걸리는 시간이 달라지는 현상을 방지

void Update()
    {
        //Time.deltaTime : 이전 프레임의 완료까지 걸린 시간
        Vector3 vec = new Vector3(
            Input.GetAxisRaw("Horizontal") * Time.deltaTime,
            Input.GetAxisRaw("Vertical") * Time.deltaTime, 0);
        transform.Translate(vec);
    }

 

'개?발 > Unity' 카테고리의 다른 글

유니티 3D 기초(기본개념) 물리(Rigidbody, Material 등)  (0) 2023.10.04