Programing/Unity(C#) 56

[Unity] AddListener로 이벤트 추가하기

기본적으로 유니티 인스펙터 창에서 위와 같은 창에서 이벤트를 연결할 수 있으나, 좀 더 편하게 스크립트 상에서 연결을 해 볼 것이다 Button 컴포넌트의 OnClick 뿐만 아니라 Slider의 OnValueChanged 등에도 같은 방식으로 연결이 가능하다 public class ClickExample : MonoBehaviour { public Button yourButton; void Start() { Button btn = yourButton.GetComponent(); btn.onClick.AddListener(TaskOnClick); } void TaskOnClick() { Debug.Log("You have clicked the button!"); } } 유니티 공식 문서 상의 예제이다 B..

[C#] const, readonly, static

static 여러 객체가 같은 값을 공유해야 할 때 사용한다 public class Counting() { public static int staticCount = 0; public int count = 0; public Counting() { staticCount++; count++; } } 위와 같이 클래스를 선언한 다음, 아래와 같이 다른 클래스에서 해당 클래스로 인스턴스를 생성한다면 public class Scene() { private void Start() { Counting count1 = new Counting(); Counting count2 = new Counting(); Counting count3 = new Counting(); int count = Counting.staticCou..

[Unity] Text Mesh Pro에서 한글 폰트가 깨지는 현상

전체가 다 깨지기도 하고 일부만 깨지기도 하는 문제가 발생했는데 폰트 에셋 파일의 인스펙터 창에서 Atlas Population Mode를 Dynamic으로 변경하니 해결되었다 아래 Sampling Point Size도 폰트에 맞게끔 조정하면 된다는데 우선 기본값으로 놔두어도 문제 없었다 참고: https://blockdmask.tistory.com/590 +) 이후로 또 폰트가 깨지는 문제가 발생하여 추가로 찾아보니 Atlas Width와 Atlas Height 값을 조정해 주니 해결되었다 해상도를 높게 설정할 수록 품질이 높아지나, 동시에 메모리도 그만큼 추가로 잡아 먹으니 고려해서 설정할 것 (* 여기서 Atlas란 컴퓨터 그래픽스에서 사용하는 용어로써, 여러 이미지 또는 텍스처를 하나의 큰 이미지..

[Unity] Text 길이에 맞게 배경 이미지 조절하기

위처럼 경고 메시지를 출력할 때 텍스트 길이에 맞게끔 뒤에 배경 이미지가 조절되게 만드는 방법 이런 식으로 이미지 컴포넌트 산하에 Text를 넣어준다 그리고 이미지 컴포넌트(Panel)에 이 두 가지 컴포넌트를 추가해준다 나의 경우 안에 들어갈 요소가 텍스트 하나라서 Horizontal 레이아웃이나 Vertical 레이아웃이나 상관 없으나 만약 여러 요소가 들어간다면 그에 맞게끔 레이아웃 그룹을 선택해 주면 된다 우선 Layout Group 컴포넌트에서 Control Child Size의 Width와 Height를 체크해준다 * Child(=Text)가 늘어남에 따라 Text 오브젝트의 길이를 조절해주기 위함 만약 텍스트가 늘어남에 따라 그냥 가로로만 늘어나게 하고 싶으면 Width에만 체크해 줘도 무방..

[C#] Action 이벤트가 중복 실행되는 문제

가끔 Action 이벤트가 중복으로 실행되는 문제가 발생하는데 그에 대한 해결법이다 1. 제거하고 추가하기 * -=를 사용해서 제거하게 되면, 존재하지 않더라도 오류가 발생하지 않는다 class.actionInvoke -= actionEvent; class.actionInvoke += actionEvent; 2. 단일 이벤트만 연결한다면 단순 대입 연산자를 사용하기 class.actionInvoke = actionEvent; 하나의 action에 하나의 이벤트만 연결한다면 해당 이벤트 하나만 연결되게 된다

[Unity] 오브젝트 위치를 Tilemap/GridLayout 칸에 맞추기

World나 Screen 좌표계 외에도 Tilemap이나 GridLayout을 기준으로 오브젝트들의 위치를 조절할 수 있다 GridLayout // Snap the GameObject to parent GridLayout using UnityEngine; public class ExampleClass : MonoBehaviour { void Start() { GridLayout gridLayout = transform.parent.GetComponentInParent(); Vector3Int cellPosition = gridLayout.WorldToCell(transform.position); transform.position = gridLayout.CellToWorld(cellPosition); } ..

[Unity] 게임 오브젝트 이동 방법(transform, rigidbody)

transform 1. transform.position transform.position += Vector3.up * moveSpeed * Time.deltaTime; - position 자체를 이동시키는 방식 * Vector3의 정적 변수를 사용하면 편하다 2. transform.Translate() transform.Translate(Vector3.up * moveSpeed * Time.deltaTime); - 전달하는 인자의 크기만큼 현재 위치에서 이동시키는 방식 Rigidbody transform을 이용하는 방식에 비해 좀 더 사실적이고 부드러운 움직임을 표현할 수 있다 1. AddForce() rb.AddForce(Vector2.up * power); - 특정 벡터만큼의 힘을 가하는 방식 - ..

[Unity] 버튼 눌리는 이벤트(Pointer Down, Pointer Up)

버튼을 누를 때 눌리고 있는 효과를 내 주기 위한 방법 1. Event Trigger 컴포넌트 활용하기 버튼 오브젝트에 Event Trigger 컴포넌트를 추가해주고, Add New Event Type으로 Pointer Down(눌렸을 때) Pointer Up(뗐을 때) 이벤트를 추가해서 스크립트 넣고 각각 이벤트 발생 시 실행할 함수를 지정해주면 된다 2. 스크립트로 추가하기 * 기존에 사용하던 이벤트 핸들러를 수정하여 사용했다 public class UI_PressEventHandler : MonoBehaviour, IPointerDownHandler, IPointerUpHandler { public Action OnDownHandler = null; public Action OnUpHandler =..

[C#] using static (정적 멤버 직접 사용)

일반적으로 C#에서 다른 클래스를 참조해 메소드 등을 사용할 때에는 클래스명.메소드 과 같이 작성해야 하지만 using static {클래스명}; 상단에 위와 같이 선언해주면 클래스명을 생략하고도 메소드나 변수 등을 사용할 수 있다 단, 혼란을 유발할 수 있기 때문에 해당 메소드나 변수가 명확하게 구별되면서 반복되는 부분에만 사용할 것