게임 오브젝트의 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 |
---|