C# 团结:可以';t获取对象';面对摄影机时要锁定的s z轴

C# 团结:可以';t获取对象';面对摄影机时要锁定的s z轴,c#,unity3d,camera,rotation,C#,Unity3d,Camera,Rotation,我想要一个精灵总是面对相机,除了在Z轴上。当我移动相机时,我的精灵总是向左或向右倾斜,我不能这样 我已经在谷歌上搜索了几个小时了。我尝试过transform.LookAt或Quaternion.LookRotation并手动将z设置为0,但无论出于何种原因,z都会不断调整。我已经看到并尝试过很多解决方案,这些解决方案都应该奏效,但就是行不通。如果有关系的话,我的精灵是另一个对象的子对象,但是尝试localRotation也不起作用。冻结刚体约束也没有效果 我能得到的最准确的结果是: 公共类广告牌

我想要一个精灵总是面对相机,除了在Z轴上。当我移动相机时,我的精灵总是向左或向右倾斜,我不能这样

我已经在谷歌上搜索了几个小时了。我尝试过transform.LookAt或Quaternion.LookRotation并手动将z设置为0,但无论出于何种原因,z都会不断调整。我已经看到并尝试过很多解决方案,这些解决方案都应该奏效,但就是行不通。如果有关系的话,我的精灵是另一个对象的子对象,但是尝试localRotation也不起作用。冻结刚体约束也没有效果

我能得到的最准确的结果是:

公共类广告牌:单一行为
{
游戏物体凸轮;
浮动正念;
//在第一帧更新之前调用Start
void Start()
{
cam=GameObject.Find(“主摄像机”);
}
//每帧调用一次更新
void LateUpdate()
{
//鳞片
minDist=cam.GetComponent().distanceMin;
transform.localScale=newvector3(1f,1f,1f)*(cam.GetComponent().distance-mindest)*1.01f/3;
//方向
变换.注视(凸轮.变换.位置);
Vector3 rot=transform.rotation.eulerAngles;
transform.rotation=Quaternion.Euler(rot.x,rot.y,0);
}
}

有了这个,我可以让精灵面对相机,但是z轴拒绝保持在零。

你尝试过旋转约束吗


我遇到了一个类似的问题,我想让一些3d文本始终向上看,但旋转到相机。
对我有效的方法是在应用注视旋转后将不需要的euler组件设置为零。
在你的情况下,应该是这样的

transform.LookAt(cam.transform.position);
var rot = transform.rotation.eulerAngles;
transform.rotation = Quaternion.Euler(rot.x, rot.y, 0);

如果您需要另一个z值,只需替换0。

特别感谢StarManta在Unity论坛上回答了这个问题

“好吧,我想我知道发生了什么。我认为,它们看起来像是旋转的,这是一种错觉;我认为他们真的是准确地指向摄像机,并且正面朝上。但是,您将相机视为具有圆形/鱼眼投影,而实际上它具有直线投影。通常情况下,这并不重要,但在这种情况下确实如此。很难确切地解释这是如何影响的,但结果是,当屏幕中心两侧的物体被设置为“朝向”相机时,它们实际上似乎围绕Y轴旋转

解决这个问题的方法其实非常简单:不要将旋转设置为查看摄影机,而是将其设置为与摄影机相同。”


我不熟悉这些。我添加了一个,激活了它,锁定了它,冻结了z约束。没有效果。还尝试将相机添加为源。什么都没有。如果他通过代码修改旋转,旋转约束将不起作用,它们只会因基于physic的动作而约束它们。他在哪里直接设置变换。旋转它将没有aff等等。你是说transform.rotation.eulerAngles吗?我只看到了euler。而且,不幸的是,这不起作用,z仍然旋转。啊,是的,我从头开始写代码。修复了它。你确定没有其他组件影响z坐标吗?这段代码将z坐标设置为0,如果它不保持为零,我怀疑我还发现了其他东西s干扰。尝试调试它,测试代码运行后eulerAngles.z是否实际为0。`transform.LookAt(cam.transform.position);Vector3 rot=transform.rotation.eulerAngles;transform.rotation=Quaternion.Euler(rot.x,rot.y,0);Debug.Log(“Euler”+transform.rotation.eulerAngles.z);检查代码的其余部分,您是否在某处引用此对象并对其进行修改?您是否在某处修改其父对象?该对象上的物理是否处于活动状态?我已禁用此代码所在的脚本,并且值不再更改,因此我认为可以安全地假设这是唯一修改旋转的代码。而且父对象在旋转后不会旋转实例化。请注意,您不应该更改四元数值本身,因为此类会进行复杂的计算。您应该阅读unity关于四元数的教程
transform.rotation = cam.transform.rotation;