![](/img/trans.png)
[英]changing transform.position never equal to transform.position + transform.forward
[英]In unity, set transform.forward cause transform.position change
我在水平移动中设置transform.forward完美,但是当我在垂直移动中使用它时,请参阅我的gif, transform.forward = newForward
将导致transform.position变化,如何使角色向前但不改变transform.position
这是我的完整脚本:
public class TestVerticalMoveForward : MonoBehaviour
{
private GameObject from;
private GameObject to;
private GameObject target;
// Use this for initialization
void Start()
{
from = GameObject.Find("From");
to = GameObject.Find("To");
target = from;
}
private float speed = 10;
// Update is called once per frame
void Update()
{
var offset = target.transform.position - transform.position;
var forward = offset.normalized;
var offset2 = speed * Time.deltaTime * forward;
if (offset.magnitude <= offset2.magnitude)
{
transform.position = target.transform.position;
if (target == to)
{
target = from;
}
else
{
target = to;
}
}
else
{
transform.position += offset2;
}
if (offset != Vector3.zero)
{
transform.forward = offset;
}
}
}
我找到了解决方案和原因,
这是固定结果
我使用Quaternion.LookRotation
而不是transform.forward=
#if UNITY_EDITOR
using System.Collections;
using System.Collections.Generic;
using Script.Ro.Ext;
using UnityEngine;
public class TestVerticalMoveForward : MonoBehaviourExt
{
private GameObject from;
private GameObject to;
private GameObject target;
// private GameObject center;
// Use this for initialization
void Start()
{
from = GameObject.Find("From");
to = GameObject.Find("To");
// center = GameObject.Find("Character/Center");
target = from;
}
private float speed = 10;
// Update is called once per frame
void Update()
{
Watch("center.transform.position", transform.position);
var offset = target.transform.position - transform.position;
var forward = offset.normalized;
var offset2 = speed * Time.deltaTime * forward;
if (offset.magnitude <= offset2.magnitude)
{
transform.position += offset;
if (target == to)
{
target = from;
}
else
{
target = to;
}
}
else
{
transform.position += offset2;
}
if (offset != Vector3.zero)
{
var upAxis = transform.rotation * Vector3.up;
transform.rotation =
Quaternion.LookRotation(target.transform.position - transform.position, upAxis);
}
}
}
#endif
团结有
Quaternion LookRotation(Vector3 forward, Vector3 upwards = Vector3.up);
我猜transform.forward =
调用内部LookRotation代码并始终upwards = Vector3.up
设置upwards = Vector3.up
(y轴),在水平移动中,它工作正常,但在垂直移动中,它表现出乎意料
所以想象物体有中心向上轴,例如,对于人形物体,向上轴是身体中心到头部中心轴,以确保垂直移动像水平移动一样执行,LookRotation 的向上应该始终是中心向上轴,看我上面的代码,这个中心轴应该是:
var upAxis = transform.rotation * Vector3.up ;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.