c# - Unity 相机无法正确跟随
问题描述
根据教程创建了一个操纵杆脚本以允许玩家移动。下面附上脚本:
public Transform player;
Vector3 move;
public float moveSpeed;
public RectTransform pad;
public void OnDrag(PointerEventData eventData)
{
transform.position = eventData.position;
transform.localPosition = Vector2.ClampMagnitude(eventData.position - (Vector2)pad.position, pad.rect.width * 0.5f);
move = new Vector3(transform.localPosition.x, 0, transform.localPosition.y).normalized;
}
public void OnPointerUp(PointerEventData eventData)
{
transform.localPosition = Vector3.zero;
move = Vector3.zero;
StopCoroutine("PlayerMove");
}
public void OnPointerDown(PointerEventData eventData)
{
StartCoroutine("PlayerMove");
}
IEnumerator PlayerMove()
{
while (true)
{
player.Translate(move * moveSpeed * Time.deltaTime, Space.World);
if (move != Vector3.zero)
{
// there is a clash here
player.rotation = Quaternion.Slerp(player.rotation, Quaternion.LookRotation(move), 5f * Time.deltaTime);
}
Debug.DrawRay(player.position, move, Color.red);
yield return null;
}
}
我也从教程中创建了一个跟随相机,它们都相互冲突。下面附上相机脚本:
public class AdvancedFollowCamera : BaseCamera
{
#region Variables
public float m_Distance = 10f;
public float m_Height = 5f;
public float m_SmoothSpeed = 2f;
private Vector3 wantedPosition;
private Vector3 wantedBack;
private float wantedYAngle;
protected JoyStickController joystick;
#endregion
#region Helper Methods
protected override void HandleCamera()
{
base.HandleCamera();
wantedYAngle = Mathf.LerpAngle(wantedYAngle, m_Target.eulerAngles.y, Time.deltaTime * m_SmoothSpeed);
Vector3 back = Vector3.back;
back = Quaternion.AngleAxis(wantedYAngle, Vector3.up) * back;
Debug.DrawRay(m_Target.position, back, Color.green);
wantedPosition = (back * m_Distance) + (Vector3.up * m_Height) + m_Target.position;
transform.position = wantedPosition;
transform.LookAt(m_Target);
}
#endregion
}
问题是当我将玩家的变换放置到相机并开始移动操纵杆时,相机到处乱转,开始忙碌地移动。玩家急转弯,相机开始旋转。我认为的部分冲突的是第一个脚本中的 player.rotation(我在那里发表了评论)。问题是我无法移除它,因为我需要它,操纵杆指向的地方玩家会看到它的方向。我昨天刚刚了解了四元数,并尝试了很多方法,但我不知道如何解决它。
我已经从另一个教程中尝试过这个脚本,但这表明玩家旋转非常快,可以说,玩家转动非常快,相机也是如此:
public class FollowCamV1 : MonoBehaviour
{
[SerializeField]
Transform target;
[SerializeField]
Vector3 defaultDistance = new Vector3(0f, 2f, -10f);
[SerializeField]
float distanceDamp = 10f;
[SerializeField]
float rotationalDamp = 10f;
Transform cam;
// Start is called before the first frame update
void Awake()
{
cam = transform;
}
// Update is called once per frame
void LateUpdate()
{
Vector3 toPos = target.position + (target.rotation * defaultDistance);
Vector3 curPos = Vector3.Lerp(cam.position, toPos, distanceDamp * Time.deltaTime);
cam.position = curPos;
Quaternion toRot = Quaternion.LookRotation(target.position - cam.position, target.up);
Quaternion curRot = Quaternion.Slerp(cam.rotation, toRot, rotationalDamp * Time.deltaTime);
cam.rotation = curRot;
}
}
有人可以告诉我问题出在哪里,我哪里出错了?
解决方案
推荐阅读
- c++ - 在另一个类中创建类实例的问题
- corda - Corda 账户功能疑点
- google-app-engine - 如何从 App Engine 应用程序连接到 Google Cloud Composer Metadata DB(Airflow metadata DB - Cloud SQL)
- mysql - SQL 外键和主键
- ruby-on-rails - Rails ActiveRecord 等效于 Laravel ORM `attach()` 方法,用于多态 has_many :through
- elasticsearch - Java regexp 到 Lucene 转换器?
- python - 根据另一列中的值复制 PySpark Dataframe 中的行并获得订单
- wso2 - 如何为这个角色添加权限?
- azure-ad-b2c - 如何使用共享邮件预先创建用户以通过 Graph API 重置密码
- cordova - 添加 cordova-plugin-wkwebview-engine 时,Mobilefirst 8 cordova 应用程序崩溃