Programing/Unity(C#) 57

[C#] Dictionary 형태로 json 데이터 파싱하기

{ "enemyStats" : [ { "ID": 1001, "hp": 20, "damage": 35, "moveSpeed": 3, "skillGuage": 20, "objectDropPer": 35 }, { "ID": 1002, "hp": 25, "damage": 30, "moveSpeed": 2, "skillGuage": 15, "objectDropPer": 30 }, { "ID": 1003, "hp": 20, "damage": 30, "moveSpeed": 4, "skillGuage": 25, "objectDropPer": 40 } ] } json 데이터를 준비해 준다 * json은 반드시 단일 오브젝트 형태로 존재해야 하기 때문에 배열을 감싸는 오브젝트를 하나 만들어주어야 한다(위 코드에서는 ene..

[C#] json 데이터 파싱하기

{ "life": "4", "hp": "100", "damage": "7", "moveSpeed": "5" } 우선 json 파일을 준비해 준다 json에서 { } 괄호는 오브젝트고, [ ] 괄호는 배열이라고 생각하면 된다 [Serializable] public class PlayerData { public int life; public int hp; public int damage; public float moveSpeed; } 데이터 틀을 만들어 준다 직렬화를 위해 반드시 위에 [Serializable]을 붙여주어야 한다(using System) 이때 각 변수들의 이름은 json 데이터에서의 각 항목들의 이름과 일치해야 한다 public class DataManager { public PlayerDa..

[Unity] 특정 방향으로 2D 오브젝트 회전시키기

Vector2 dir; transform.rotation = Quaternion.Euler(0, 0, Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg); * 유니티는 회전 각도를 나타날 때 쿼터니언을 사용하기 때문에 Vector3가 아니라 Quaternion.Euler를 사용해야 한다. (짐벌락 현상을 방지하기 위함) 2D상에서의 회전은 Z축을 회전시키면 되기 때문에 x와 y의 값은 0으로 고정시켜 둔다 Mathf의 Atan2는 아크탄젠트 함수(역삼각함수)로, y와 x를 가지고 사잇각을 구할 수 있다 * Atan과 Atan2함수가 있는데, Atan 함수는 인자로 float값(y/x)를 받고, Atan2 함수는 인자로 y값과 x값을 각각 받는다. 따라서 Atan 함수는 만약 x가..

[Unity] 캐릭터의 움직임이 버벅거리는 문제(Rigidbody Interpolate)

캐릭터를 생성하고 시네머신 카메라를 이용해 follow를 시켰더니 간혹 버벅거리면서 이동하는 현상이 눈에 띄었다 Rigidbody 컴포넌트의 Interpolate(보간)을 조정해 주니 어느정도 해결되었다 None: 보간 X Interpolate: 이전 움직임을 기반으로 보정(Extrapolate보다 부드러운 움직임이 나온다) Extrapolate: 현재 velocity를 기준으로 오브젝트의 다음 position을 예측하여 움직임을 보정 https://docs.unity3d.com/ScriptReference/RigidbodyInterpolation.html 추가적으로 찾아보니 입력을 통해 플레이어를 움직이게 하는 경우 Extrapolate 보간이 더 유용하다고 한다

[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..