
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerMove : MonoBehaviour
{
CharacterController cc;
[SerializeField] InputActionReference mv;
[SerializeField] GameObject planet;
[SerializeField] float fallSpeed;
[SerializeField] float moveSpeed;
[SerializeField] float rotateSpeed;
float verticalVel;
void Start()
{
cc = GetComponent<CharacterController>();
}
void Update()
{
Fall();
Rotate();
Move();
}
private void Fall()
{
if (cc.isGrounded) { verticalVel = -2f; }
else verticalVel -= fallSpeed * Time.deltaTime;
}
private void Rotate()
{
Vector3 upDir = (transform.position - planet.transform.position).normalized;
Quaternion targetRot = Quaternion.FromToRotation(transform.up, upDir) * transform.rotation;
transform.rotation = targetRot;
}
private void Move()
{
Vector2 movement = mv.action.ReadValue<Vector2>();
Vector3 move = new Vector3(movement.x, 0, movement.y).normalized;
move.y = verticalVel;
move = transform.TransformDirection(move);
cc.Move(move * Time.deltaTime * moveSpeed);
Debug.DrawRay(transform.position, move, Color.red, 2f);
}
}
실패 (계속 원점으로 되돌아가려고 함. 수직 방향까지 가면 아예 안 움직임.)

원인 : Character Controller의 collider는 회전되지 않음

void Update()
{
Fall();
Rotate();
Move();
}
private void Fall()
{
verticalVel = -10f;
// else verticalVel -= fallSpeed * Time.deltaTime;
}
private void Rotate()
{
Vector3 upDir = (transform.position - planet.transform.position).normalized;
Quaternion targetRot = Quaternion.FromToRotation(transform.up, upDir) * transform.rotation;
transform.rotation = targetRot;
}
private void Move()
{
Vector2 movement = mv.action.ReadValue<Vector2>();
Vector3 move = new Vector3(movement.x, 0, movement.y).normalized;
move = transform.TransformDirection(move) * moveSpeed;
move += verticalVel * transform.up;
rb.linearVelocity = move;
// Debug.DrawRay(transform.position, move, Color.red, 2f);
}
rb 기반으로 변경
zittering 발생하여 cinemachine brain update mode 변경하여 해결


