首页 > 解决方案 > 统一设置transform.forward引起transform.position变化

问题描述

我在水平移动中设置了 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;
        }
    }
}

标签: c#unity3d

解决方案


我找到了解决方案和原因,

解决方案:

这是固定的结果

在此处输入图像描述

我用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(y 轴),在水平移动中,它工作得很好,但在垂直移动中,它的表现出乎意料

所以想象物体有上中轴,例如,对于人形物体,上轴,是身体中心到头部中心轴,为了确保垂直移动像水平移动一样,LookRotation的向上应该总是中心上轴,看我上面的代码,这个中心向上的轴应该是:

       var upAxis =  transform.rotation * Vector3.up ;

推荐阅读