Как заставить моего персонажа бегать вокруг камеры от третьего лица? - PullRequest
0 голосов
/ 10 мая 2018

Я работаю над беговой игрой от третьего лица, и я хотел достичь определенного вида движения, но мне трудно даже представить, как оно будет работать, не говоря уже о его кодировании.

По сути, при удерживании влево или вправо, я хочу, чтобы игрок вращался вокруг камеры. Такой эффект камеры можно увидеть здесь . Это именно то, чего я хочу достичь.

Вот мои движения и код камеры. Я представляю, что мне нужно использовать вращение Y камеры, чтобы добиться этого, но мои тесты не сработали. Любой вклад будет оценен!

Движение:

public int speed = 10;
public int rotationSpeed = 10;

public CharacterController cc;
Vector2 input;
Vector3 moveDir;
Vector3 lookDir;

Vector3 forward;
Transform camTransform;

public Transform model;

void Start () {
    cc = GetComponent<CharacterController>();
    camTransform = Camera.main.transform;
}

void GetInput() {
    input.x = Input.GetAxisRaw("Horizontal");
    input.y = Input.GetAxisRaw("Vertical");
}

void CalculateForward()
{

}

void Move()
{
    moveDir.x = input.x;
    moveDir.z = input.y;

    if(moveDir.magnitude > 1)
    {
        moveDir.Normalize();
    }

    Vector3 rotatedDir = Camera.main.transform.TransformDirection(moveDir);
    rotatedDir = new Vector3(rotatedDir.x, 0, rotatedDir.z);
    rotatedDir = rotatedDir.normalized * moveDir.magnitude;

    cc.Move(rotatedDir * speed * Time.deltaTime);
}

void ApplyGravity()
{

}

    void FaceDir()
{
    if (moveDir != Vector3.zero)
    {
            transform.rotation = Quaternion.Slerp(
            transform.rotation,
            Quaternion.LookRotation(-moveDir),
            Time.deltaTime * rotationSpeed
        );
    }
}


private void FixedUpdate()
{
    GetInput();
    //ApplyGravity();
    Move();
    FaceDir();
    ApplyGravity();
}

}

Камера:

 [SerializeField]
private float distanceAway;
[SerializeField]
private float distanceUp;
[SerializeField]
private float smooth;
[SerializeField]
private Transform follow;

private Vector3 targetPosition;

private void Start()
{
    follow = GameObject.FindWithTag("Player").transform;
}

private void LateUpdate()
{
    targetPosition = follow.position + follow.up * distanceUp - follow.forward * distanceAway;
    transform.position = Vector3.Lerp(transform.position, targetPosition, Time.deltaTime * smooth);

    transform.LookAt(follow);
}

1 Ответ

0 голосов
/ 10 мая 2018

Движение по кругу всегда в направлении, касательном к кругу, поэтому при каждом обновлении вы хотите:

  • Установите вращение Y игрока, чтобы смотреть прямо на ось Y камеры
  • поверните игрока на 90 градусов влево или вправо (в зависимости от направления, в котором вы хотите идти)
  • продвиньте игрока вперед на расстояние, которое будет зависеть от скорости, с которой вы хотите, чтобы он двигался

Помните, что невозможно идеально пройти по кругу, потому что на нем бесконечно много точек, но этот подход достаточно хорошо приблизит его.

...