오늘 학습 키워드
유니티 숙련 개인 프로젝트 도전기능 만들기
오늘 학습 한 내용을 나만의 언어로 정리하기
도전기능
벽타기 및 매달리기
어찌저찌 성공.
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을 만들지 않을거에요.