오늘 학습 키워드

유니티 숙련 개인 프로젝트 도전기능 만들기

오늘 학습 한 내용을 나만의 언어로 정리하기

도전기능

벽타기 및 매달리기

어찌저찌 성공.
IsGrounded 만든 것처럼 OnWall 을 만들어서 Move에서 이동하는 축을 다르게 함

void Move()
{
    if (!onWall) // 바닥에 있을 때
    {
    // 바닥에 있을
        Vector3 dir = transform.forward * curMoveInput.y
        + transform.right * curMoveInput.x;
        dir *= moveSpeed;
        // y축 속도는 그대로 유지
        dir.y = rb.velocity.y;
        rb.velocity = dir;
    }
    else // 벽에 있을 때
    {
    // 벽에 있을 때는 위 아래로 
        Vector3 dir = transform.up * curMoveInput.y
            + transform.right * curMoveInput.x;
        dir *= moveSpeed;
        dir.z = rb.velocity.z;
        rb.velocity = dir;
    }
}

장비 장착

단검을 장착하면 속도가 빨라지도록 함

레이저 트랩

두 물체의 방향과 거리를 토대로 레이를 쏴서 트랩을 만듬.

상호작용 가능한 오브젝트 표시

레이저 트랩이랑 연동해서 레이저를 끄고 킬 수 있게 함

플랫폼 발사기

public class PlatformShooter : MonoBehaviour
{
    public float shootPower;
    public void Shoot()
    {
        Rigidbody rb = PlayerManager.Player.controller.rb;
        Debug.Log(rb.velocity);
        rb.AddForce(rb.velocity * shootPower + Vector3.up * shootPower, ForceMode.Impulse);
    }
}

플랫폼 슈터를 따로 만듬

발전된 AI

AI가 물 부분을 지날 수 있도록 물을 Not Walkable 에서 Water로 바꾸고 그 대신에 코스트를 5로 증가

그리고 게임이 시작될 때 NavMesh를 Bake하도록 변경하려고 했으나 엄청난 렉으로 취소함

개인 프로젝트 소모임

내 프로젝트 피드백

  • 옵저버는 늘 기본임.
  • 이벤트 버스형을 유니티에서 안쓸수도있음
  • 그러나 근본은 옵저버에서 시작됨. 도구로써 쓰는게 좋음
  • 이것저것 써보는 시도가 좋음!

다른 분 피드백 / 아이디어

  • 플랫폼 위에 올라가면 부모를 플랫폼으로 해서 같이 움직일 수 있도록 하심
  • 아이템의 지속시간에 따라 쿨타임 표시 위치를 다르게 하심
  • 외부 힘을 따로 저장해 두는게 좋을 듯
  • 내적 이용해서 위에서 점프해서 도착했을 때에만 플랫폼을 부모로 만드는 방법 사용
  • Impulse랑 VelocityChange 차이는 질량을 고려하는지 안하는지의 차이
  • 특정 부분에 진입하면 몬스터를 생성해서 싸움. 아레나!
    • 팩토리 패턴 써보시는게 어떤지?
  • 소비 아이템을 ctrl + shift 로 퀵슬롯 변경 가능하게 하신것
  • 컴포넌트를 인터페이스로 잘게 쪼개는걸 권장하고 있음.
  • Rigidbody 관련 팁 : 직접 구현해봐라.
  • 싱글톤은 세 가지만 피해라
    • God Object를 피해라. (책임이 엄청난)
    • 매니저 단위에서 싱글톤을 썼다고 해도 전달 가능한건 직접 전달해봐라.
    • 점을 너무 많이 쓰지 말자.

튜터님의 말씀

  • DoSomething에 충격받으심
  • 그러나 박싱/언박싱에는 도움이 될 수도 있음
  • 기본을 잡아둔다는 느낌
  • Property drawer 유용함! 알아두시길 (Custom Editor)
  • 깃허브 데스크톱은 정말 못 만든 툴이다.
  • 깃 포크 or 소스트리 사용하셈
  • 라이더도 써봐라

학습하며 겪었던 문제점 & 에러

문제 1

  • 문제&에러에 대한 정의

키 입력이 도대체가 적용이 안됨

  • 내가 한 시도

최대한 Debug.Log를 막 집어넣어서 뭐라도 했음 바인딩을 하려는데 ObjectDisposedException 오류가 났다.

  • 해결 방법

애초에 이렇게 접근하면 안됐음!!!!!!!!!!!!!!!!!!!

public void SaveBindings()
{
    try
    {
        string json = runtimeActions.SaveBindingOverridesAsJson();
        PlayerPrefs.SetString(PlayerPrefsKey.InputSettingKey, json);
        PlayerPrefs.Save();
        Debug.Log("테스트 : " + PlayerPrefs.GetString(PlayerPrefsKey.InputSettingKey));
        Debug.Log("Input bindings saved to PlayerPrefs.");
    }
    catch (Exception e)
    {
        Debug.LogError($"SaveBindings failed: {e.Message}");
    }
}
 
public void LoadBindings()
{
    if (PlayerPrefs.HasKey(PlayerPrefsKey.InputSettingKey))
    {
        string json = PlayerPrefs.GetString(PlayerPrefsKey.InputSettingKey);
        runtimeActions.LoadBindingOverridesFromJson(json);
        runtimeActions.Enable();
        Debug.Log("Input bindings loaded from PlayerPrefs.");
    }
    else
    {
        Debug.Log("No saved input bindings found in PlayerPrefs. Using defaults.");
    }
}

SaveBindingOverrideAsJson을 써라!!!!!!!!!!!!!!!!!

  • 새롭게 알게 된 점

json을 통짜로 저장하지 마라!!!!!!!!!!!!!

  • 이 문제&에러를 다시 만나게 되었다면?

다시는 Input System을 만들지 않을거에요.