2017-10-13 7 views
1

私は、下のスクリプトの 'XSensitivity'の値を別のスクリプトから変更しようとしています。名前空間内のクラス内のfloatにアクセスする

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; 
} 

私が手にエラーが.. ArgumentExceptionがある:GetComponentはMonoBehaviourまたはコンポーネントから要求されたコンポーネントのHeadLook "派生することを必要とするか、またはインタフェースです。

ありがとうございました。

+0

クラスは 'MonoBehaviour'から派生しないので、コンポーネントではないので、そのコンポーネントを得ることができません。 'HeadLook'のインスタンスを含むスクリプトを探してみてください。 –

+0

エラーが発生している行は次のとおりです。 m_HeadLook = GetComponent < HeadLook >(); –

答えて

0

プライベートHeadLook m_HeadLook。

void Awake() 
{ 
    m_HeadLook = new HeadLook(8f,8f); 
    sensitivitySlider.value = m_HeadLook.MyHeadLook.XSensitivity; 
} 

GetComponentはMonoBehaviourではないため、使用できません。

また、あなたのHeadLookは本当に必要ではないHeadLookオブジェクトを作成しているようです。あなたはシングルトンをしようとするように見える、それはより多くのようになります:

public static HeadLook MyHeadLook = null; 

public HeadLook (float rotX, float rotY) 
{ 
    if(MyHeadLook != null) {return;} 
    MyHeadLook = this; 
    rotX = XSensitivity; 
    rotY = YSensitivity; 
} 

これは本当に単純化されていますが、シングルトンの開始となります。

編集:コメントセクションの誰かが、シングルトンを適切に使用することを確認する任務になります。私の答えはあなたが間違っていたという事実をただちに知っていただけで、私はあなたに簡単なものを提供していました。 これを完全に説明するページへのリンクがあります。

http://wiki.unity3d.com/index.php/Singleton

1

あなただけmonobehaviourからクラスを派生する必要があります:

using System; 
using UnityEngine; 
using UnityStandardAssets.CrossPlatformInput; 

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

必要に応じてMBから派生させる必要があります。たぶんこの場合ですが、通常、インスペクタの割り当てやエンジンからのコールバック(更新、UIイベントなど)が必要ない場合は、メモリ使用量を増やすので、MBを避けるほうがよいでしょう。 – Everts

0

エラーがそれを言う: "GetComponentが必要と要求されたコンポーネントMonoBehaviourから 'HeadLook' 派生"

潜在的な修正:

  1. 派生MonoBehaviorからHeadLookとしませんHeadLookのコンストラクタを定義する(他の手段でrotXとrotYを設定する必要があります)
  2. HeadLookのメンバーとして設定あなたの呼び出しスクリプトは、GetComponent(つまり、GetComponent)を使用しません。
関連する問題