목록Categories (1103)
KoreanFoodie's Study
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bZOYT0/btrGS5TFVyC/hPNpc1vOo1EfXqnHIQDV21/img.webp)
Udemy 관련 개념 정리 및 Dev Log 를 기록하고 있습니다! 유니티에서 일시정지하기 유니티에서는 일시 정지 기능을 어떻게 구현하면 될까? 먼저 결론만 말하자면, Time.timeScale 값을 조절하여 Time.deltaTime 을 0 으로 만드는 방식을 이용하면 된다. void PauseGame () { Time.timeScale = 0; } void ResumeGame () { Time.timeScale = 1; } 이런 방식을 이용하면, 각 게임 오브젝트들의 Update 내 함수에서 Time.deltaTime 에 의존하는 모든 동작이 멈추게 된다. 이 말은즉슨, Time.deltaTime 에 의존하지 않는 녀석들의 경우에는 여전히 일시정지라는 본연의 목적과 다른 동작을 할 수 있음을 의미한다..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bwgp7u/btrGLdK5onI/yXMAHG2e9ZHQG3WAKL3nK0/img.jpg)
유니티 공부 노트 Touch Input 이용시 에러? 분명히 에디터에서는 마우스 클릭 입력으로 잘 동작했는데, 모바일로 빌드하니 제대로 작동을 하지 않아 원인을 파악하던 중, Input 관련에 문제가 있다는 것을 알게 되었다. 기존에는 터치 입력을 다음과 같이 구현했었는데... (후략) if (Input.GetTouch(0).phase == TouchPhase.Began) { JumpButtonPressed(); } 근데 이 경우, argumentexception: index out of bounds 에러가 발생했었다. 이는 터치 자체가 없는데, Input 에서 Touch 의 첫번째 인덱스를 가져오려 해서 생긴 문제였다. 따라서 다음과 같이 간단히, Touch 배열이 비어있지 않은지 체크해주기만 하면 된..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/beF67M/btrGlUGpUG4/hNVHiy3E1qPZrRZk9rX9l1/img.jpg)
Udemy 강좌를 들으며 내용 복습을 위해 기록하는 글입니다 유니티 #1-4 : tag 사용하기 유니티는 tag 를 이용해 게임 오브젝트를 쉽게 식별할 수 있다. 예를 들어, 플레이어가 충돌하면 점수를 올리는 코드를 짠다고 가정해 보자. private void OnCollisionEnter(Collision other) { if (other.gameObject.tag == "Player") { GetComponent().material.color = Color.red; gameObject.tag = "Hit"; } } 위 코드는 플레이어와 해당 오브젝트가 충돌을 하면 색깔을 빨간색으로 바꾸고, 현 게임 오브젝트의 태그를 Hit 으로 변경한다. 이때, 충돌한 오브젝트가 플레이어인지 아닌지 판단을 하기 위해..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ANS5z/btrGthA5IL3/zMKOREe0xKZyPxKuFFg5G0/img.jpg)
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..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/lnvPa/btrGtPdhBb6/uHGK0t6L1WTLJJAbZtCk60/img.jpg)
Udemy 강좌를 들으며 내용 복습을 위해 기록하는 글입니다 유니티 #1-2 : CineMachine 사용하기 일반적인 게임들은 플레이어의 움직임에 카메라 시점이 연동되서 같이 움직인다. CineMachine 을 사용하면 해당 기능을 간단하게 구현할 수 있다. 먼저, Window -> Package Manager 로 들어가서, Packages 설정을 Unity Registry 로 바꾼다. 그 후, Cinemachine 을 검색해 설치한다. Cinemachine 에서 Virtual Camera 를 생성하고, MainCamera 에 CinemachineBrain 이라는 컴포넌트를 추가한다. 위 사진에서는 Live Camera 로 Virtual Follow Camera 가 들어가 있는데, 아까 전에 만든 Vi..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/l4Lr5/btrGtP5plzj/KiwC9jiDV8kTBTVk3mfn90/img.jpg)
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..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/7HNdT/btrFzSIqlDH/f4uuduiB9Bhtbk4xByQ7Q0/img.jpg)
Widget 에 들어갈 데이터와 클래스 멤버 변수 연동 (bind) 하기 게임을 플레이하다 보면 아이템마다 다른 설명 창이 뜨는 것을 확인할 수 있다. 이 경우, 사실 이를 보여주는 위젯(창)은 똑같이 생겼지만, 내용물은 다른 것을 알 수 있는데... 위젯에 들어가는 내용과 클래스의 정보를 연동하면 위젯의 내용을 아이템에 맞게 띄워 줄 수 있다. 순서대로 이를 만들어 보자. 1. 먼저 Widget Blueprint 를 만든다. 그리고 내용물을 우리가 원하는 대로 채워넣는다. 2. 해당 위젯을 띄울 클래스에서 위젯 컴포넌트를 선언하고, 이를 넣어 준다. item.h /* Popup widget for when the players look at the item */ UPROPERTY(EditAnywhere..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/StENA/btrFueyaO3R/wqpfBUxbgvEbEmCrkGXVy1/img.jpg)
int8 이 외않되? 물론 Visual Studio 에서는 int8 을 잘만 쓸 수 있다. 하지만 만약 int8 변수를 언리얼에서도 쓰려고 한다면... /* Item count (ammo, etc) */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item Properties", meta = (AllowPrivateAccess = "true")) int8 ItemCount; 에러가 발생한다. 찾아보니 버그 픽스를 요청하던데... 단순히 언리얼에서는 int8 을 지원하지 않아서 그런게 아닐까? 뭐, uint8 은 지원하니 메모리 절약을 위한 것이 목적이라면 uint8 을 쓰면 되겠다. int8 을 써서 에러가 생기는 경우, 어디서 에러가 생겼는지 짚어주..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/IbpMP/btrFoO8jCYb/13I0KfmeJFOaPELGr4OWM0/img.jpg)
헤드샷 구현하기 (부위별 피격 데미지 설정) FPS 게임을 하다보면 헤드샷에 추가 데미지 (혹은 즉사) 를 주는 경우가 많은데, 이는 어떻게 구현하면 될까? 간단한 방식으로는, 일단 총알을 맞은 Enemy 클래스 내 Skeletal Mesh 의 Bone Name 을 참고하는 방법이 있다. 스켈레톤 트리를 보면 일반적으로 다음과 같이 head 가 있는 것을 확인할 수 있다. 이제 데미지를 받는 함수를 다음과 같이 수정하면 된다. AEnemy* HitEnemy = Cast(BeamHitResult.Actor.Get()); if (HitEnemy) { if (BeamHitResult.BoneName.ToString() == HitEnemy->GetHeadBone()) { // Head shot } else {..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/DRPtH/btrFsXPvyCy/66KbvkEakmgXOa12e1XFU0/img.jpg)
Does Implement Interface 기능으로 데미지, 인터랙션 구현하기 총을 쏘았을때, 맞은 대상이 Enemy 이면 데미지를 전달하고 싶거나, 만약 상호작용 가능한 오브젝트인 경우 상호작용을 하고 싶다고 가정하자. 해당 기능을 어떻게 구현하면 좋을까? 물체의 경우, 각 물체에 트리거를 심는 경우도 생각해 볼 수 있겠지만, 배치되는 모든 오브젝트마다 트리거를 따로 설정해야 된다고 생각하면 너무 끔찍할 것이다. 데미지의 경우, 총에 맞은 액터가 데미지를 받을 수 있는지 없는지를 어떻게 판별하면 좋을까? 사실 Enemy 말고도 부술 수 있는 오브젝트도 마찬가지로 데미지를 받아야 할텐데, 각 클래스마다 데미지를 받는지 안 받는지를 설정하는 것은 매우 귀찮은 일이다. 언리얼에서는 Does Implemen..