Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将相机旋转夹紧到特定范围?_C#_Unity3d - Fatal编程技术网

C# 如何将相机旋转夹紧到特定范围?

C# 如何将相机旋转夹紧到特定范围?,c#,unity3d,C#,Unity3d,我有一个相机,我想限制的音调,在大多数第一人称游戏。在这种情况下,相机是一个单独的游戏对象,其父对象为玩家。以下是我所拥有的: using System.Collections; using System.Collections.Generic; using UnityEngine; public class RotationExample : MonoBehaviour { public int lookSpeed = 500; //main camera, parente

我有一个相机,我想限制的音调,在大多数第一人称游戏。在这种情况下,相机是一个单独的游戏对象,其父对象为玩家。以下是我所拥有的:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RotationExample : MonoBehaviour
{
    public int lookSpeed = 500;

    //main camera, parented to player.
    public GameObject view = new GameObject();

    void Update()
    {
        view.transform.Rotate(-Input.GetAxis("Mouse Y") * lookSpeed * Time.deltaTime, 0, 0);

        Vector3 viewRotation = view.transform.localEulerAngles;
        viewRotation.x = Mathf.Clamp(viewRotation.x, -90, 90);
        view.transform.localEulerAngles.Set(viewRotation.x, 0, 0);

        //print euler angles for debugging
        print("" + view.transform.localEulerAngles);
    }
}

使用这种设置,似乎根本没有任何效果;没有夹紧和抖动<代码>打印显示一旦旋转达到-90(270 in
打印
),y和z旋转从0翻转到180,x旋转继续倒计时。正如您所期望的,反转也发生在正90。

您的代码创建了一个名为
视图
的空游戏对象。此游戏对象未指定附加的组件。它也不是任何其他游戏对象的父对象。因此,您似乎试图操纵空游戏对象的位置

Unity文档建议避免由于其不可预测的行为而直接操纵。如果必须更改localEulerAngles,则建议使用

您正在使用
Transform.localEulerAngles.Set
的同时,在Update()函数中应用
Transform.Rotate
。尝试设置对象旋转的两种不同方法

以下代码可应用于作为摄影机组件的脚本集。或者修改,如果您希望操纵子游戏对象的变换。请注意,您的脚本不处理围绕相机X轴(左-右)移动的旋转,我假设这是您预期的功能,并将其从代码中省略:

[Header("Inspector Attributes")]
[SerializeField] private float lookSensitivity = 100.0F;
[SerializeField] private float yAxisClampDegrees = 90.0F;

float yRotation;

void Update()
{
    float mouseY = Input.GetAxis("Mouse Y") * lookSensitivity * Time.deltaTime;

    yRotation -= mouseY;
    yRotation = Mathf.Clamp(yRotation, -yAxisClampDegrees, yAxisClampDegrees);

    transform.localRotation = Quaternion.Euler(yRotation, 0, 0);
}

游戏对象通过拖放界面链接到编辑器中的相机。我使用了localEulerAngles,正如我在这个站点的多个类似问题中看到的,我希望保持相对于局部坐标的旋转,因为角色本身会旋转以进行偏航。unity文档建议不要直接修改四元数,除非您确切知道自己在做什么,因此我避免了在这方面的摸索,并假设在不使用四元数的情况下存在一个合理的替代方案。我想四元数,欧拉就是我要找的。