목록Categories (1104)
KoreanFoodie's Study

Udemy 관련 개념 정리 및 Dev Log 를 기록하고 있습니다! 유니티 Awake 와 Start 차이 유니티에서 Awake 와 Start 는 둘 다 초기화를 담당한다. 그런데 어떤 차이가 있는 걸까? Awake() : 모든 변수와 게임의 상태를 초기화하기 Awake 는 일반적으로 게임이 시작되기 전에 호출 (start 보다 먼저 호출) 되며, 모든 오브젝트가 초기화되고 호출된다. 따라서 GameObject.FindWithTag 를 이용해 해당 게임 오브젝트를 요처하거나 다른 오브젝트와 안전하게 상호작용기 가능하다. [주의] : 각 게임 오브젝트의 Awake() 는 랜덤 순서로 실행되므로, 스크립트간의 참조(reference) 를 설정하기 위해 Awake 를 사용하고, 정보를 보내고 받는 경우에는 St..

Udemy 관련 개념 정리 및 Dev Log 를 기록하고 있습니다! 유니티에서 일시정지하기 유니티에서는 일시 정지 기능을 어떻게 구현하면 될까? 먼저 결론만 말하자면, Time.timeScale 값을 조절하여 Time.deltaTime 을 0 으로 만드는 방식을 이용하면 된다. void PauseGame () { Time.timeScale = 0; } void ResumeGame () { Time.timeScale = 1; } 이런 방식을 이용하면, 각 게임 오브젝트들의 Update 내 함수에서 Time.deltaTime 에 의존하는 모든 동작이 멈추게 된다. 이 말은즉슨, Time.deltaTime 에 의존하지 않는 녀석들의 경우에는 여전히 일시정지라는 본연의 목적과 다른 동작을 할 수 있음을 의미한다..

유니티 공부 노트 Touch Input 이용시 에러? 분명히 에디터에서는 마우스 클릭 입력으로 잘 동작했는데, 모바일로 빌드하니 제대로 작동을 하지 않아 원인을 파악하던 중, Input 관련에 문제가 있다는 것을 알게 되었다. 기존에는 터치 입력을 다음과 같이 구현했었는데... (후략) if (Input.GetTouch(0).phase == TouchPhase.Began) { JumpButtonPressed(); } 근데 이 경우, argumentexception: index out of bounds 에러가 발생했었다. 이는 터치 자체가 없는데, Input 에서 Touch 의 첫번째 인덱스를 가져오려 해서 생긴 문제였다. 따라서 다음과 같이 간단히, Touch 배열이 비어있지 않은지 체크해주기만 하면 된..

Udemy 강좌를 들으며 내용 복습을 위해 기록하는 글입니다 유니티 #1-4 : tag 사용하기 유니티는 tag 를 이용해 게임 오브젝트를 쉽게 식별할 수 있다. 예를 들어, 플레이어가 충돌하면 점수를 올리는 코드를 짠다고 가정해 보자. private void OnCollisionEnter(Collision other) { if (other.gameObject.tag == "Player") { GetComponent().material.color = Color.red; gameObject.tag = "Hit"; } } 위 코드는 플레이어와 해당 오브젝트가 충돌을 하면 색깔을 빨간색으로 바꾸고, 현 게임 오브젝트의 태그를 Hit 으로 변경한다. 이때, 충돌한 오브젝트가 플레이어인지 아닌지 판단을 하기 위해..

Udemy 강좌를 들으며 내용 복습을 위해 기록하는 글입니다 유니티 #1-3 : Time.time 사용하기 Time.time 을 사용하면, 게임에서 얼마만큼의 시간이 흘렀는지를 체크할 수 있다. 다음 코드를 보자. public class Dropper : MonoBehaviour { [SerializeField] float DropTime = 3.0f; MeshRenderer meshRenderer; Rigidbody DropperRigidBody; void Start() { DropperRigidBody = GetComponent(); DropperRigidBody.useGravity = false; meshRenderer = GetComponent(); meshRenderer.enabled = fal..

Udemy 강좌를 들으며 내용 복습을 위해 기록하는 글입니다 유니티 #1-2 : CineMachine 사용하기 일반적인 게임들은 플레이어의 움직임에 카메라 시점이 연동되서 같이 움직인다. CineMachine 을 사용하면 해당 기능을 간단하게 구현할 수 있다. 먼저, Window -> Package Manager 로 들어가서, Packages 설정을 Unity Registry 로 바꾼다. 그 후, Cinemachine 을 검색해 설치한다. Cinemachine 에서 Virtual Camera 를 생성하고, MainCamera 에 CinemachineBrain 이라는 컴포넌트를 추가한다. 위 사진에서는 Live Camera 로 Virtual Follow Camera 가 들어가 있는데, 아까 전에 만든 Vi..

Udemy 강좌를 들으며 내용 복습을 위해 기록하는 글입니다 유니티 #1-1 : SerializeField 사용하기기 변수를 선언할 때, 다음과 같이 앞에 [SerializeField] 를 붙여주면, 에디터 내에서도 실시간으로 해당 값을 조정할 수 있다. public class Mover : MonoBehaviour { [SerializeField] float moveSpeed = 10.0f; void Update() { MovePlayer(); } void MovePlayer() { float xValue = Input.GetAxis("Horizontal"); float zValue = Input.GetAxis("Vertical"); transform.Translate(xValue * moveSpeed..

Widget 에 들어갈 데이터와 클래스 멤버 변수 연동 (bind) 하기 게임을 플레이하다 보면 아이템마다 다른 설명 창이 뜨는 것을 확인할 수 있다. 이 경우, 사실 이를 보여주는 위젯(창)은 똑같이 생겼지만, 내용물은 다른 것을 알 수 있는데... 위젯에 들어가는 내용과 클래스의 정보를 연동하면 위젯의 내용을 아이템에 맞게 띄워 줄 수 있다. 순서대로 이를 만들어 보자. 1. 먼저 Widget Blueprint 를 만든다. 그리고 내용물을 우리가 원하는 대로 채워넣는다. 2. 해당 위젯을 띄울 클래스에서 위젯 컴포넌트를 선언하고, 이를 넣어 준다. item.h /* Popup widget for when the players look at the item */ UPROPERTY(EditAnywhere..

int8 이 외않되? 물론 Visual Studio 에서는 int8 을 잘만 쓸 수 있다. 하지만 만약 int8 변수를 언리얼에서도 쓰려고 한다면... /* Item count (ammo, etc) */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item Properties", meta = (AllowPrivateAccess = "true")) int8 ItemCount; 에러가 발생한다. 찾아보니 버그 픽스를 요청하던데... 단순히 언리얼에서는 int8 을 지원하지 않아서 그런게 아닐까? 뭐, uint8 은 지원하니 메모리 절약을 위한 것이 목적이라면 uint8 을 쓰면 되겠다. int8 을 써서 에러가 생기는 경우, 어디서 에러가 생겼는지 짚어주..

헤드샷 구현하기 (부위별 피격 데미지 설정) FPS 게임을 하다보면 헤드샷에 추가 데미지 (혹은 즉사) 를 주는 경우가 많은데, 이는 어떻게 구현하면 될까? 간단한 방식으로는, 일단 총알을 맞은 Enemy 클래스 내 Skeletal Mesh 의 Bone Name 을 참고하는 방법이 있다. 스켈레톤 트리를 보면 일반적으로 다음과 같이 head 가 있는 것을 확인할 수 있다. 이제 데미지를 받는 함수를 다음과 같이 수정하면 된다. AEnemy* HitEnemy = Cast(BeamHitResult.Actor.Get()); if (HitEnemy) { if (BeamHitResult.BoneName.ToString() == HitEnemy->GetHeadBone()) { // Head shot } else {..