유니티 5

Enum의 활용

내가 Enum을 처음 배웠을 때 든 생각은 "저걸 어따쓰지" 이였다. 상수에 이름을 붙여서 어떠한 이득을 주는지 알지 못했고 그것이 필요한 상황을 만나지 못했기 때문이다. 하지만 프로젝트를 같이하던 한 프로그래머 분이 이것을 활용하는 것을 보았고 그때부터 Enum의 활용과 필요성에 대해 느끼게 되었다. enum Item { axe, //0 meat, //1 rope = 5 //5 stone = 10 //10 } enum은 쉽게 말하면 상수에 이름을 붙이는 것이다. 위처럼 Item을 선언하면 Item.axe는 0, Item.meat는 1이 된다. 이러한 Enum을 이용하면 아이템처럼 특정 이름에 인덱스를 필요로 하는 경우에 활용될 수 있다. enum Item { axe, //0 meat, //1 rope ..

Unity 분석 2023.01.07

메모리 구조와 유니티 - GC에 대한 심층적 이해

개발을 하다보면 "메모리가 낭비된다", "메모리 누수" 등 메모리를 효율적으로 사용해야 한다는 내용들이 많이 나온다. 그렇다면 어떻게 하면 우리가 게임을 만들 때 메모리를 아낄 수 있을까? 내가 쓴 코드에서 어느 부분이 저장될까? 유니티에서 C# 스크립트를 할 때 메모리가 어떻게 할당되고 사용되는지 알아보자. 위 사진은 컴퓨터 메모리 구조이다. 프로그래밍에 대해 배우다 보면 한두번쯤은 봤을 것이다. 메모리는 크게 코드, 데이터, 힙, 스택 영역으로 나뉘어 저장된다. 아래 예제를 통해 어느 부분이 어디에 저장되는지 알아보자. using System.Collections; using System.Collections.Generic; using UnityEngine; [System.Serializable] p..

Unity 분석 2023.01.05

GameObject.Find()

GameObject.Find(string name) 함수는 찾고자 하는 오브젝트의 이름을 안에 넣으면 해당 이름을 가진 오브젝트를 찾아준다. ex) using UnityEngine; public class Find : MonoBehaviour { private GameObject player; private void Start() { player = GameObject.Find("Player"); } } 하지만 나는 이 GameObject.Find() 함수를 최대한 지양한다. 그 이유는 다음과 같다. 1. 오브젝트의 이름이 바뀌거나 중복되는 경우 이 함수를 여러 스크립트에 남용을 했다가 개발도중에 해당 오브젝트의 이름이 바뀌는 경우가 생길 수 있다. 이런 경우 해당 함수를 썼던 스크립트를 모두 수정해야 ..

Unity 분석 2023.01.04

물체가 이동하면서 얇은 벽을 통과하는 경우

위 사진은 벽과 공에 모두 콜라이더와 Rigidbody를 넣었으나 서로 영향을 미치지 못한 상황이다. 이러한 현상이 왜 발생할까? 원인은 아래 코드에 있다. using UnityEngine; public class Move : MonoBehaviour { void Update() { if(Input.GetKey(KeyCode.A)) { transform.position += Time.deltaTime * new Vector3(-20, 0, 0); } } } 이 코드는 A 버튼이 눌렸을 때 1초에 -20만큼 좌측으로 공을 이동시키는 코드이다. 이때 벽이 너무 얇아 이동하는 도중에 벽을 지나쳐 버린 것이다. 이러한 문제를 해결하기 위해서는 여러가지 방법들이 있다. 그중 하나는 Raycast를 사용해서 앞에 ..

Unity 분석 2023.01.04

FixedUpdate

FixedUpdate는 유니티에서 물리연산을 하는데 최적화된 함수이다. 그렇다면 이 FixedUpdate가 무슨 이점을 주길레 물리연산을 할때 써야할까? 아래는 같은 코드를 FixedUpdate문과 Update문에 넣고 실행한 결과이다. 위에 있는 동그라미가 FixedUpdate, 아래에 있는 동그라미는 Update로 실행한 것이다. using UnityEngine; public class Move : MonoBehaviour { void Update() { if(Input.GetKey(KeyCode.A)) { transform.position += Time.deltaTime * new Vector3(-10, 0, 0); } } } using UnityEngine; public class MoveFixe..

Unity 분석 2023.01.04