[英]How to lock z rotation in Unity3D?
我试图让移动控件统一工作,但是当我尝试向左和向右看时,相机会稍微倾斜,所以我想锁定 z 旋转,但我不能。
using UnityEngine;
using DitzeGames.MobileJoystick;
namespace DitzeGames.MobileJoystick.Example
{
public class BoxMover : MonoBehaviour {
public Transform transform;
protected Joystick Joystick;
protected Button Button;
protected TouchField TouchField;
// Use this for initialization
void Awake ()
{
Joystick = FindObjectOfType<Joystick>();
Button = FindObjectOfType<Button>();
TouchField = FindObjectOfType<TouchField>();
}
// Update is called once per frame
void FixedUpdate () {
transform.position = new Vector3(transform.position.x +
Joystick.AxisNormalized.x * Time.deltaTime * 3f, Button.Pressed ? 2 : 1,
transform.position.z + Joystick.AxisNormalized.y * Time.deltaTime * 3f);
transform.Rotate(Vector3.up, TouchField.TouchDist.x);
transform.Rotate(Vector3.left, TouchField.TouchDist.y);
}
}}
谁能帮我 ? 谢谢 !
只需添加一个刚体并锁定 z 旋转,然后关闭重力。 你可以将它的碰撞器设置为触发,这样它就不会撞到任何东西。
这是我为完全锁定相机旋转而不使用刚体而编写的解决方案。 只需创建此脚本并将其添加到您的相机(或您想锁定的任何内容)。
public class RotationLock : MonoBehaviour
{
private Quaternion lockedRotation;
void Start() { lockedRotation = transform.rotation; }
void Update() { transform.rotation = lockedRotation; }
}
这是另一个版本,可让您选择要锁定的轴。 我为一个 3D 手机游戏编写了它,用户可以通过滑动来旋转他们的视图。
public class RotationLock : MonoBehaviour
{
public bool lockX, lockY, lockZ;
private Vector3 startRotation;
void Start() { startRotation = transform.rotation.eulerAngles; }
void LateUpdate()
{
Vector3 newRotation = transform.rotation.eulerAngles;
transform.rotation = Quaternion.Euler(
lockX ? startRotation.x : newRotation.x,
lockY ? startRotation.y : newRotation.y,
lockZ ? startRotation.z : newRotation.z
);
}
}
可能有更有效的解决方案,但这些都是在紧要关头工作,不会涉及物理系统!
尝试添加将在每帧结束时重置相机倾斜度的代码。
var rot = transform.rotation;
Camera.main.transform.rotation = new Quaternion(rot .x,rot .y, 0, rot .w);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.