繁体   English   中英

unity中,设置transform.forward导致transform.position改变

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM