Programing/Unity(C#) 52

[C#] Coroutine 사용

1. 코루틴 이름 private void Start() { StartCoroutine(nameof(TestCoroutine)); // 코루틴 시작 StopCoroutine(nameof(TestCoroutine)); // 코루틴 정지 StartCoroutine(nameof(TestCoroutine)); // 코루틴 시작 } private IEnumerator TestCoroutine() { // 함수 } 코루틴 이름을 직접 명시하는 방식이다 * 매개변수를 전달할 수 없다 * stop coroutine으로 코루틴을 멈춘 후 다시 시작시킬 경우 이전 진행 상황은 초기화된다 2. 함수 private void Start() { StartCoroutine(TestCoroutine()); // 코루틴 시작 Start..

[C#] 반복문 내에서 List 요소 삭제 시 주의할 점

별 생각 없이 이런 식으로 for문을 돌렸는데, 위와 같은 식으로 코드를 작성하게 될 경우 반복문을 도는 중에 요소가 삭제되게 되면 특정 인덱스를 건너뛰는 상황이 발생할 수 있게 된다 for문 루프 도는 순서를 반대로 변경하면 중간에 특정 요소를 삭제하더라도 정상적으로 나머지 배열의 요소들을 탐색할 수 있게 된다

[Error] UnassignedReferenceException

원인은 target 변수를 public으로 지정해두는 바람에 0번에 None 오브젝트가 하나 생겨 있었다 인스펙터 창을 따로 건들인 기억이 없는데 왜 생성되어 있는지는 모르겠지만, private으로 변경하고 나니 시작할 때의 target count가 0으로 잘 설정된 것을 확인할 수 있었다 위와 같은 오류의 경우 해당 변수가 존재하지 않는다 정도의 뜻이니 해당 변수를 잘 확인해 볼 것

[C#] Action Invoke로 인자 전달하기

public class Class1 : MonoBehaviour { Action action; private void Trigger() { action.Invoke(); } } public class Class2 : MonoBehaviour { private void Start() { action += {Class1 Component}.ActionFunc } public void ActionFunc() { Debug.Log("action"); } } 기본적으로 Action을 사용해서 다른 클래스의 특정 함수를 동작시키기 위해서는 1. Action 변수 생성 2. 다른 클래스에서 해당 Action에 함수를 추가 3. Action을 Invoke 하면 다른 클래스의 해당 함수가 실행 하는 식으로 동작한다 그런..

[Error] get_persistentDataPath is not allowed to be called from a MonoBehaviour constructor

GameManagerEx 스크립트 파일에서 로컬 저장 기능 구현을 위해 path 변수를 선언하는 과정에서 에러 메시지가 발생하였다 public string _path = Application.persistentDataPath + "/SaveData.json"; UnityException: get_persistentDataPath is not allowed to be called from a MonoBehaviour constructor (or instance field initializer), call it in Awake or Start instead. Called from MonoBehaviour 'Managers' on game object '@Managers'. See "Script Seriali..

[Unity] Rect Transform Animation Position 변경하기

Rect Transform을 갖고 있는 텍스트 오브젝트에 애니메이션을 붙이려고 했는데, Position Property를 선택했더니 Z 포지션밖에 변경할 수가 없었다 Position 대신 Anchored Position을 사용해야 x와 y의 위치를 조정할 수 있다 Anchored가 붙어 있어 Anchors를 조정하는 프로퍼티라고 생각했는데, Anchors 프로퍼티는 따로 있었다 출처: https://forum.unity.com/threads/i-can-only-change-rect-transforms-z-position.328178/

[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에만 체크해 줘도 무방..