Как сделать так, чтобы камера следовала за игроком, как будто она прикреплена цепочкой?

#c# #unity3d

#c# #unity3d

Вопрос:

Я написал тривиальный скрипт для камеры, чтобы следить за игроком:

 public class SmoothFollow : MonoBehaviour
{
    public Transform Target;
    public float SmoothTime = 0.3f;
    public Vector3 Offset = new Vector3(0, 2, -3);
    private Vector3 velocity = Vector3.zero;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        Vector3 targetPosition = Target.TransformPoint(Offset);
        transform.position = Vector3.SmoothDamp(transform.position,
            targetPosition, ref velocity, SmoothTime);
    }
}
  

Это работает так, как мне нужно, пока игрок не продвинется вперед. НО когда игрок поворачивается вправо или влево (всегда на 90 градусов) Я хочу, чтобы камера подождала, пока игрок отойдет немного подальше, а после камера плавно повернулась и продолжила следовать за ним.

Как реализовать это поведение?

Эскиз

Я надеюсь, что это прояснит мой вопрос.

P.S. В моей игре нет стен, и камере не нужно проверять столкновения со стенами.

UPD
Я улучшил свой скрипт:

 public class SmoothFollow : MonoBehaviour
{
    public Transform Target;
    public float SmoothTime = 0.3f;
    private float distance;
    private Vector3 velocity = Vector3.zero;

    // Start is called before the first frame update
    void Start()
    {
        distance = Vector3.Distance(transform.position, Target.localPosition);
    }

    // Update is called once per frame
    void Update()
    {
        Vector3 offset = transform.position - Target.position;
        if (offset.magnitude > distance)
        {
            offset = Vector3.ClampMagnitude(offset, distance);
            Debug.Log(offset);
            transform.position = Vector3.SmoothDamp(transform.position,
            offset, ref velocity, SmoothTime);
            transform.rotation = Quaternion.Lerp(transform.rotation,
                Target.rotation, Time.deltaTime);
        }
    }
}
  

Это больше соответствует тому, что мне нужно, но все еще далеко от плавного следования.

Комментарии:

1. answers.unity.com/questions/737568/camera-tether.html

2. @Jason, да, это немного похоже на поворот камеры, который мне нужен, но у меня пассивная камера (в моей игре нет контроллера камеры, он просто следует за игроком). Я могу вращать камеру в соответствии с вращением игрока, но я не знаю, как сделать это плавно, когда игрок уже будет немного далеко

3. @Jason, короче говоря, игрок, например, уже повернул влево и продолжает работать, но камера начинает вращаться только тогда, когда расстояние между ними достигло некоторого предела.

4. Вам просто нужно проверить расстояние до игрока, и если оно превышает определенное расстояние, вам нужно либо замедлить, либо использовать функцию ослабления, чтобы сократить расстояние, если вы хотите более плавное движение. Вы можете использовать библиотеку функций облегчения: gist.github.com/Fonserbc/3d31a25e87fdaa541ddf — tbh хотя похоже, что вы в значительной степени делаете это..

5. В чем проблема, с которой вы сталкиваетесь с вашим текущим сценарием? У вас есть какие-нибудь зажимы?

Ответ №1:

Проблема в этой строке

 transform.position = Vector3.SmoothDamp(transform.position,
    offset, ref velocity, SmoothTime);
  

Поскольку offset она относится к началу координат, при интерполяции между transform.position и offset вы получите странные результаты. Исправление заключается в следующем:

 transform.position = Vector3.SmoothDamp(transform.position,
    Target.position   offset, ref velocity, SmoothTime);