안녕하세요

프로그램 과정에서 막혔던 문제들에 대한 해결책 정리


페이지 목록

2024년 12월 19일 목요일

[Unity] TextMeshPro에서 Outline을 바꾸면 모든 TextMeshPro에서 다 같이 적용되는 이유

TextMeshPro에서는 Material을 이용해서 사용하게 되는데 Outline을 건드리는 것은 이러한 Material 값을 변경하는 것이기 때문에 동일한 Material을 이용하는 다른 TextMeshPro에도 같이 적용 될 수 밖에 없다. 이것을 방지 하기 위해서는 다른 Material을 세팅해서 사용하라는 거 같은데 방법은 좀더 찾아 봐야 하겠다.

출처: https://www.reddit.com/r/Unity3D/comments/p0809v/why_does_all_my_text_change_color_when_i_change/

[Unity] Text가 사라지고 TextMeshPro만 있는 상황 TextMeshPro를 사용하는 방법은

 using TMPro


TMP_Text Text;


로 사용한다.


좀 더 자세한 내용은 아래 출처에서 확인 해보자.

출처:https://discussions.unity.com/t/access-textmeshpro-text-through-script/699157

2024년 12월 18일 수요일

[Unity] The non-generic type 'List' cannot be used with type arguments Error

 using System.Collections.Generic;

이 빠졌을 때 나타나는 에러이다.


윗 줄에 using System.Collections.Generic; 을 추가해주자.


출처: https://discussions.unity.com/t/lists-c/46716



[Unity] HP Bar 에서 피가 깍이거나 찰 때 에니메이션 효과 주기

 아무래도 HP Bar에서 피가 깍이거나 찰 때 그냥 바로 까이면 뭔가 없어보이게 된다.

 예를 들어 피가 10일 때 7이 되었을 때 그냥 바로 7로 깍이는 것이다.

 이런 상황에 에니메이션 효과로 10에서 7까지 주르륵 깍이는 것을 구현한다면 좀 더 자연스럽게 HP가 변화되는 효과를 주면서 보기에 편하다. 


 이를 구현한 유튜버를 소개한다.



[Unity] 무지개색 Hp Bar 만드는 방법

 로스트아크 보스 잡을 때처럼 피통을 스택으로 쌓아서 무지개색이 번갈아 나오면서 나타나도록 하고 싶었다. 

 생각해보면 피통을 100으로 잡았을 때 전체 HP가 1423이라면 무지개색 빨주노초파남보 7가지 색깔이 순서대로 돌아가면 될 것이다.

  1423/100 = 14가 나오기 때문에 14 + 1인 15번째 빨간색이 나타나야 되고 그 아래 색깔은 15 -1인 보라색으로 나타나야 한다.


그리고 현재 보이는 피통은 1423%100을 해서 나온 23이라는 피가 피통인 100에 표현되면 된다. 즉 0.23만큼 보여주면 되는 것이다. (23/100)


 이런 식으로 구현하면 될 것이라 생각하고 있었는데 명쾌하게 정확하게 내가 원하는 그 부분을 그대로 보여주는 유튜버가 있어서 소개한다.


출처: https://youtu.be/b6cRRNvA1PM?si=ui_3UsZRzMk9NyVg



2024년 12월 16일 월요일

[Unity] MovePosition 사용 시 Rigidbody.Position을 이용하는 이유

 출처 : https://blog.naver.com/kbh3983/223255473776


 MovePosition을 사용할 때 up down left right arrow 를 누를 때 마다 0.01씩 추가하거나 뺀다고 하면 벽을 만나서 움직이지 않는 경우에도 내부적으로는 카운터가 계속 더해지고 있다.


예를 들어 위에 있는 벽을 만났을 때 10번 위 화살표 버튼을 누르면 내부적으로는 이미 포지션이 0.01*10 = 0.1 까지 올라가 있는 상황이 되고 이 때 우측으로 이동하여 벽에서 나오는 순간 갑자기 10칸 위로 0.1위치로 이동한다.

 이를 방지 하기 위해서 현재 위치 + up down left right arrow 를 눌렀을 때 0.01 씩 이동을 사용하게 되면 벽에 막혔을 경우 매 프레임마다 현재 위치 + 0.01 을 하게 되는데 0.01이 더해져도 다음계산시에는 현재 위치가 벽에 막혀서 움직이지 않았기에 계속해서 현재 포지션으로 초기화 된다. 이 상황에서 벽을 빠져 나와도 현재 포지션 기준으로 이동을 하기 때문에 순간 이동이 발생하지 않는다. 


그래서 아래와 같이 Rigidbody.Position + curVector 를 사용해서 이동하게 된다.

playerRigidbody.MovePosition(playerRigidbody.position + moveDistance);

[Unity] RigidBody를 Kinematic으로 사용할까 vs dynamic에 Gravity 0 으로 사용할까

 Kinematic으로 사용하면 벽과의 충돌을 뚫고 들어가기 때문에

벽에 막히는 처리를 직접 계산해서 해야 한다.


 Dynamic 에 Gravity 0으로 사용할 경우 벽과 충돌하면 막히게 되기에 따로 처리해 주지 않아도 된다.


이 외에도 다른 부분들이 많이 있겠지만 지금으로서는 Kinematic으로 벽에 막히는 충돌을 직접 계산해서 코딩해 넣는 거 보다는 벽에 막히게끔 기본 제공해주는 Gravity 0으로 개발 하면서 좀 더 고민해 봐야겠다.

[Unity] Float과 Double 관계

출처: https://fiftiesstudy.tistory.com/189 

Unity는 기본적으로 0.3 과 같이 사용하면 double로 인식한다.

Float으로 인식할려면 f나 F를 뒤에 적어줘야 한다.


2024년 12월 15일 일요일

[Unity] 2 Kinematic rigidbody 간에 Trigger와Collision의 차이점

 2 Kinematic rigidbody간에 Collision은 발생할 수 없다.

둘 중 하나는 Dynamic rigidbody로 만들어야 상호작용이 발생한다.


Trigger는 상황이 조금 다르다.

둘 다 Kinematic 이라도 하나의 Collider를 Is Trigger 로 체크하면 둘 사이에 Trigger가 발생한다.

2024년 12월 14일 토요일

[Unity] Kinematic RigidBody가 벽을 뚫고 지나가지 않게 할 수 없는가?

 여러 군데 검색해 봤는데 


 Kinematic이 물리를 적용하지 않는다고 체크하는 것이기에 벽에 막히는 등의 물리적인 현상에 적용을 받지 않아서 벽에서 막히지 않게 된다고 한다.


 그럼 어떻게 벽에 막히게 하는가? 


 그것은 내부적인 물리계산을 통해서는 못하기 때문에 직접 Trigger를 받아서 직접 만들어야 한다고 한다.


 직접 만드는 거 말고 방법이 없는 것인지 좀 더 찾아봐야겠다.

2024년 12월 13일 금요일

[Unity] GameObject 이름으로 GameObject 찾기 (Find Gameobject Using Name)

출처: https://docs.unity3d.com/6000.0/Documentation/ScriptReference/GameObject.Find.html
https://discussions.unity.com/t/change-game-objects-name-when-in-runtime/443963/2
this.character = Instantiate(charPrefab, new Vector3(0, 0, 0), Quaternion.identity);
this.character.name = "Character"; 
 이런 식으로 character의 name에 이름을 적어준다.
 그 후 호출할때에는 this.player = GameObject.Find("Character"); 
 이런식으로 Find를 사용하여 이름을 적어주면 해당 이름의 GameObject를 찾게된다.

[Unity] Animator Setfloat

출처: https://wergia.tistory.com/212%22%3Ehttps://wergia.tistory.com/21
https://docs.unity3d.com/ScriptReference/Animator.SetFloat.html
Animation 을 만들 때 만들어 놓은 parameter 값을 script 파일에서 변경할 때 사용된다.

 SetFlaot("파라미터이름",float값); 

으로 사용한다. 

 예를들어 movementX 라는 파라미터이름을 사용했다면 아래와 같이 f값을 넣어주게 된다.

 characterAnimator = character.GetComponent(); characterAnimator.SetFloat("movementY", -1f); 

 이 외에도 Float , int, Bool, Trigger도 사용할 수 있다. 자세한 것은 아래 페이지에서 확인해 보자.

2024년 12월 12일 목요일

[Unity] StartCoroutine이란?

출처: https://www.blogger.com/blog/post/edit/4269806382658593631/6526622373607187254 https://blog.naver.com/dj3630/221459387675
 Coroutine은 애니메이션 효과를 원하는 시간동안 보여주기 위해 쓴다고 한다. 

 그냥 update 에 넣으면 왜 안되는가? 

 사실 잘 모르겠는데 이런 저런 이유로 update 안에서 넣는 경우에 원하는 시간만큼 안 나올 수가 있다고 한다. 

 그런 경우에 coroutine에 넣어서 사용하면 원하는 시간 동안 보여준다고 한다.

 for( i = 1 ; i >= 0; i-=0.1) 
 yield return new WaitForSeconds(0.1f); 

이런식으로 쓰면 waitforseconds로 인해 0.1f 동안 있다가 실행이 되고 for문을 보면 알다시피 10번 동안 실행된다. 

  그래서 0.1초 간격으로 10번 실행되게 되는 것이다. 
 이런식으로 원하는 시간동안 실행하는 함수를 만들때 쓰게 된다.