c# - 统一设置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;
}
}
}
解决方案
我找到了解决方案和原因,
解决方案:
这是固定的结果
我用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 ;
推荐阅读
- google-cloud-platform - 如何使用 Terraform 在 Google Compute Image 上设置位置
- javascript - 任务相互依赖的递归 Promise 链
- javascript - Angular Typescript - 异步等待内部订阅
- windows - 从 ubuntu 连接到 SSAS(SQL Server 分析服务)
- python - Apache Beam - Python 中的“无法腌制生成器对象”
- c++ - 如何通过clang完全解析cpp文件?
- ios - 如何避免我的登录 cookie 被 iOS Safari 删除?
- visual-c++ - 无法现代化这些 C 风格的演员表
- java - 对于 TimeZone 类型,方法 getTimeZone(String) 未定义
- json - Splunk:并非为长 JSON 文件提取所有字段值