문제점
- 플랫폼 발사기 (난이도 : ★★★★★)
- 캐릭터가 플랫폼 위에 서 있을 때 특정 방향으로 힘을 가해 발사하는 시스템 구현특정 키를 누르거나 시간이 경과하면 ForceMode를 사용해 발사
사실 처음에 조건을 확인했을때 점프대랑 다른점은 특정 키를 눌러서 발동하는점인가? 싶어서 왜 난이도가 별 다섯개인지 이해를 못했다. 점프대도 특정방향인 y가 +되게 더해주니깐..
점프대는 필수구현조건이였다.
<참고>
- 점프대 Rigidbody ForceMode (난이도 : ★★★☆☆)
- 캐릭터가 밟을 때 위로 높이 튀어 오르는 점프대 구현
- OnCollisionEnter 트리거를 사용해 캐릭터가 점프대에 닿았을 때 ForceMode.Impulse를 사용해 순간적인 힘을 가함.
근데 그건 아닌 것 같아서 점프대 기능과 비슷하지만 z를 추가로 이동시켜주는 방향으로 추가해서 만들어봤다.
해결 방법?
처음에는 포물선의 위치로 하지않고 기존 점프대랑 비슷하게 했는데 이상했던점은 자연스럽게 날아가는게 아니라 갑자기 순간이동하듯 목표지점으로 이동한다음에 툭 떨어졌다.
이상했던 코드는 지워서 지금 기록으로는 없긴한데.. Q를 눌렀을때 순간이동을 하는건지, 아니면 빠르게 목표지점으로 슉 이동하는건지.. 어찌됐든 기분 나빴기때문에 열심히 RigidBody도 만져보고 했건만.. 잘 안됐다.
해결 방법
> 참고 블로그
포물선 함수는 이분꺼 복붙해왔습니다. 감사감사합니다..
확실히 자연스러운 모습으로 바뀌었다.
근데 문제점은 자연스럽게 날아가서 떨어지는데 어느 지점부터 자꾸 벽에 막힌것처럼 툭 떨어졌다.
y가 바닥인 -5이상인 지점까지 자연스럽게 포물선으로 떨어져야하는데 z위치만 도달하면 그냥 하늘에서 툭하고 떨어진것이다.
나는 혹시 목표지점인곳에 도달했는데 시간을 모두 사용해서 안되는건가? 싶어서 시간을 늘려주니 진짜 느리게 목표지점까지 날아가다가 비슷한 지점에서 툭 떨어지고..
목표지점인 z의 값을 늘려주면 더 길게 갔다가 그 지점에서 툭 떨어지고..
사람을 화나게 하는데 자신있는지 나를 모니터 하나를 부순 사람처럼 행동하게 만들었다.
결국 마지막에 목표지점의 값에 y도 지정해서 넣어줬는데 이럴수가..
아주 잘되는 모습을 볼 수 있다.
그렇다. 내 위치의 y값은 이미 다이빙대에 서있는 위치로 정해져있어서 그 위치가 목표지점이 된거라 그런것이였다...
나는 바보였다..
계속 똑같은 지점에서 떨어지는걸 미리 확인했으면 바로 고쳤을텐데 포물선간 값이 이상하게 적용되어 그런줄 알고 다른곳만 죽어라 판거였다.
그래도 성공적으로 해결하니 마음은 후련합니다요.
플랫폼 발사대가 이걸 뜻하는건지는 모르겠는데 어떻게든 새로운 기능을 써봤다는것에 저는 만족합니다..
해결 코드
충돌이 일어났을때만 Q가 눌려야하니 SetCurrentTrickItem에 내 Type값을 보내주고
이제 PlayerController에서는 Q가 눌리면 그 값을 확인해서 코루틴을 실행
private void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.CompareTag("Player"))
{
playerObject = collision.gameObject;
if (playerRigidbody != null)
{
switch (trickItemData.trickItemType)
{
// 생략
case TrickItemType.DivingJumpPad:
Debug.Log("다이빙대랑 충돌");
CharacterManager.Instance.Player.GetComponent<PlayerController>().SetCurrentTrickItem(this);
break;
}
}
}
public void OnDivingJumpInput(InputAction.CallbackContext context) // 다이빙대에서 Q 누르면 튀어나감
{
if (context.phase == InputActionPhase.Started)
{
if (currentTrickItem != null && currentTrickItem.trickItemData.trickItemType == TrickItemType.DivingJumpPad)
{
StartCoroutine(DiveToTarget());
}
}
}
private IEnumerator DiveToTarget()
{
Vector3 startPos = transform.position; // 플레이어 위치
Vector3 endPos = transform.position + transform.forward * 20f + Vector3.down * 10f; // 목표 지점 (Z 방향으로 +20, Y 방향으로 -10)
float height = 5f; // 포물선의 높이
float duration = 1.5f; // 목표까지 이동하는 데 걸리는 시간
float elapsedTime = 0f; // 경과 시간
while (elapsedTime < duration)
{
// 포물선 운동 계산
Vector3 targetPos = Parabola(startPos, endPos, height, elapsedTime / duration);
// 이동
transform.position = targetPos;
elapsedTime += Time.deltaTime;
yield return null;
}
}
// 포물선 함수
protected static Vector3 Parabola(Vector3 start, Vector3 end, float height, float t)
{
Func<float, float> f = x => -4 * height * x * x + 4 * height * x;
Vector3 mid = Vector3.Lerp(start, end, t);
return new Vector3(mid.x, f(t) + Mathf.Lerp(start.y, end.y, t), mid.z);
}
오늘의 회고
어려워요.. 더 사방팔방으로 튕길 수 있는 오브젝트를 만들 수 있을 것 같은데 아직은 방법을 잘 모르겠네요.
직접 포물선으로 지정하는거말고도 괜찮은게 있다면 꼬옥... 알려주세요..
유니티 내장 함수들이 뭐가 있는지 잘 몰라서 맨땅에 헤딩하는 기분이네요.
그리고 3D멀미가 심해서 멀미약 먹으면서 하는데 죽을 것 같아요.
'Record > TIL' 카테고리의 다른 글
[Unity] Find 함수 장단점 (0) | 2024.05.31 |
---|---|
[Unity] 낮일때는 회복되고 밤일때는 소모되는 UI 만들기 (0) | 2024.05.30 |
[Unity] 티스토리 너 가만안둔다.. (4) | 2024.05.29 |
[Unity] AI 네비게이션 (2) | 2024.05.27 |
[Unity] SOLID 원칙 (4) | 2024.05.24 |