Programing/Unity(C#) 52

[Unity, Spine] Spine 스킨 변경이 안 되는 문제(setSkin, setSlotsToSetupPose)

skeleton.SetSkin() 함수를 사용하여 스킨을 변경하는데, default 상태에서 처음 스킨을 변경할 때는 잘 동작했으나 1번 스킨에서 2번 스킨으로 넘어가는 게 되질 않았다 https://esotericsoftware.com/spine-api-reference API Reference - Spine Runtimes GuideThe Spine Runtimes are available for many programming languages. To simplify documentation, the API reference below is programming language agnostic. There may be minor differences for some languages, such as ..

[Unity] 플랫폼 위에서 아래로 점프하는 플레이어(하단 점프)

플레이어가 플랫폼 위에 올라간 상태에서 아래를 향해 점프할 수 있도록 구현해 볼 것이다 private IEnumerator coDownJump() { float y = transform.position.y; WaitForFixedUpdate wait = new WaitForFixedUpdate(); capsuleCollider.isTrigger = true; while (transform.position.y > y - 1.6f && transform.position.y = 2) return; if (_jumpCount == 1 && _unlockDoubleJump == false) return; rb.velocity = new Vector2(rb.velocity.x, 0); rb.AddForce(Vect..

[Unity] 땅에서 플랫폼 위로 점프하는 플레이어 (Platform Effector 2D)

아래쪽에서 플랫폼이 있는 쪽으로 뛰어도 머리를 부딪히지 않고 통과하여 올라가게 만드는 방법은 유니티에 이미 존재하는 컴포넌트를 사용하면 간단하다 플랫폼 오브젝트에 Platform Effector 컴포넌트를 추가해준다 이때, Composite Collider 등의 컴포넌트에서 Used By Effector 옵션을 체크해줘야 플랫폼 이펙터가 정상적으로 적용된다 Platform Effector에서는 Use One Way 옵션에 체크해주면 된다 아래는 해당 컴포넌트의 옵션들에 대한 추가 설명 Use Collider Mask: Collider Mask 사용 여부를 묻는 옵션, 체크 해제할 경우 Collider Mask 옵션이 가려진다 Rotational Offset: 로컬 기준 위쪽을 가르키는 회전 오프셋 오프셋..

[C#] 다른 클래스의 코루틴 함수 호출하기

Player player = other.GetComponent(); player.StartCoroutine(coContinousDamage(_damage, 1.0f, 3)); Player 클래스의 코루틴 함수를 위와 같은 방식으로 호출하려고 하면 해당 함수를 찾을 수 없다고 에러가 뜬다 Player player = other.GetComponent(); player.StartCoroutine(player.coContinousDamage(_damage, 1.0f, 3)); 코루틴도 인스턴스명.코루틴명 으로 찾아주어야 해당 코루틴 함수를 찾아서 실행시킬 수 있다

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

[C#] Press 입력 받기

마우스 왼쪽 버튼을 길게 누르고 있는 경우를 판단하는 게 필요해서 기존의 InputManager를 수정하였다 public class InputManager { public Action MouseAction = null; private bool isPressed = false; private float _pressedTime; private float MIN_PRESS_TIME = 0.2f; public void OnUpdate() { if (Input.GetMouseButton(0)) { isPressed = true; _pressedTime += Time.deltaTime; if (_pressedTime >= MIN_PRESS_TIME) { MouseAction.Invoke(Define.MouseEve..

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

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