#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);