C# 访问类中、命名空间中的浮点值

C# 访问类中、命名空间中的浮点值,c#,class,unity3d,namespaces,C#,Class,Unity3d,Namespaces,我正在尝试从另一个脚本更改下面脚本中“xsensitity”的值 using System; using UnityEngine; using UnityStandardAssets.CrossPlatformInput; namespace UnityStandardAssets.Characters.FirstPerson { [Serializable] public class HeadLook { public float XSensitivity = 8f; pub

我正在尝试从另一个脚本更改下面脚本中“xsensitity”的值

using System;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;

namespace UnityStandardAssets.Characters.FirstPerson
{
[Serializable]
public class HeadLook
{
    public float XSensitivity = 8f;
    public float YSensitivity = 8f;
    public float MinimumX = -60F;
    public float MaximumX = 60F;

    public float xRotRaw;
    public float yRotRaw;

    public HeadLook (float rotX, float rotY)
    {
        rotX = XSensitivity;
        rotY = YSensitivity;
    }
    // create an instance (an Object) of the HeadLook class
    public HeadLook MyHeadLook = new HeadLook(8,8);

    private float xRot;
    private float yRot;

    private float xRotation;
    private float yRotation;

    //          ----------------------------
    public void LookRotation(Transform character, Transform head)
    {
        yRotRaw = CrossPlatformInputManager.GetAxisRaw("HorizontalLook");
        xRotRaw = CrossPlatformInputManager.GetAxisRaw("VerticalLook");

        yRot = CrossPlatformInputManager.GetAxisRaw("HorizontalLook") * XSensitivity;
        xRot = CrossPlatformInputManager.GetAxisRaw("VerticalLook") * YSensitivity;

        yRotation -= yRot * 10 * Time.deltaTime;
        yRotation = yRotation % 360;
        xRotation += xRot * 10 * Time.deltaTime;
        xRotation = Mathf.Clamp(xRotation, MinimumX, MaximumX);
        head.localEulerAngles = new Vector3(-xRotation, -0, 0);
        character.localEulerAngles = new Vector3(0, -yRotation, 0);
    }
    //          ----------------------------
}
}
我想这可能行得通,但我错了

    using UnityEngine;
using UnityStandardAssets.Characters.FirstPerson;

private HeadLook m_HeadLook;

void Awake ()
{
    m_HeadLook = GetComponent< HeadLook >();
    sensitivitySlider.value =  m_HeadLook.MyHeadLook.XSensitivity;
}
使用UnityEngine;
使用UnityStandardAssets.Characters.FirstPerson;
私人头条m_头条;
无效唤醒()
{
m_HeadLook=GetComponent();
灵敏度slider.value=m_HeadLook.MyHeadLook.XSensitivity;
}
我得到的错误是。。 ArgumentException:GetComponent要求请求的组件“HeadLook”派生自MonoBehavior或组件,或者是接口


谢谢。

您只需要从MonoBehavior派生类:

using System;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;

namespace UnityStandardAssets.Characters.FirstPerson
{
[Serializable]
public class HeadLook : MonoBehaviour
{
...

私人头条m_头条

void Awake ()
{
    m_HeadLook = new HeadLook(8f,8f);
    sensitivitySlider.value =  m_HeadLook.MyHeadLook.XSensitivity;
}
您不能在其上使用GetComponent,因为它不是单一行为

此外,您的HeadLook似乎正在创建一个实际上并不必要的HeadLook对象。你似乎想做一个单身汉,那更像是:

public static HeadLook MyHeadLook = null;

public HeadLook (float rotX, float rotY)
{
    if(MyHeadLook != null) {return;}
    MyHeadLook = this;
    rotX = XSensitivity;
    rotY = YSensitivity;
}
这真的很简单,但这将是单身汉的一个开始

编辑:评论部分有人把确保您正确使用singleton作为一项任务。我的回答只是一个简单的提示,告诉你你做错了,我提供了一些简单的方法让你走。 这里有一个链接,指向一个完整解释它的页面

错误说明:“GetComponent要求请求的组件‘HeadLook’来自MonoBehavior

潜在的修复方法:

  • 从MonoBehavior派生HeadLook,不要为HeadLook定义构造函数(您应该通过其他方式设置rotX和rotY)
  • 将HeadLook设置为调用脚本的成员,在这种情况下,您将不使用GetComponent(即m_HeadLook=new HeadLook(1f,2f))

  • 该类不是从
    monobhavior
    派生的,因此您无法获取它的组件,因为它不是一个组件。尝试查找包含
    HeadLook
    实例的脚本。错误所在的行是。m_HeadLook=GetComponent();您应该在需要时从MB派生。可能是在这种情况下,但通常情况下,如果不需要inspector分配或任何来自引擎的回调(更新、UI事件等),则最好避免MB,因为它会增加内存使用。