Unity5中的错误CS0120

时间:2015-09-12 05:31:56

标签: c# unity3d

我正在研究Unity5上的Stealth教程。当我写“警报灯”脚本时,出现了这个错误

  

Assets / AlarmLight.cs(28,31):错误CS0120:访问非静态成员`UnityEngine.Light.intensity'需要对象引用

这是整个脚本;

using UnityEngine;
using System.Collections;

    public class AlarmLight : MonoBehaviour {

    public float fadeSpeed = 2f;
    public float highIntensity = 2f;
    public float lowIntensity = 0.5f;
    public float changeMargin = 0.2f;
    public bool alarmOn;


    private float targetIntensity;

    void Awake(){
        GetComponent<Light>().intensity = 0f;
        targetIntensity = highIntensity;
    }

    void Update()
    {
        if (alarmOn) {
            GetComponent<Light>().intensity = Mathf.Lerp (GetComponent<Light>().intensity, targetIntensity, fadeSpeed * Time.deltaTime);
            CheckTargetIntensity ();
        }
        else
            {
            Light.intensity = Mathf.Lerp (GetComponent<Light>().intensity, 0f, fadeSpeed * Time.deltaTime);
        }

        }



    void CheckTargetIntensity (){
        if (Mathf.Abs (targetIntensity - GetComponent<Light>().intensity) < changeMargin) {
            if (targetIntensity == highIntensity) {
                targetIntensity = lowIntensity;
            }
            else {
                targetIntensity = highIntensity;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

基本上,编译器告诉你的是你试图像静态成员一样使用实例成员,这显然是不正确的。

在代码中查看此行

 else {
     Light.intensity = Mathf.Lerp (GetComponent<Light>().intensity, 0f, fadeSpeed * Time.deltaTime);
 }

在右侧,您使用GetComponent<Light>().intensity,这是访问单个Light强度的正确方法。

但是,在LEFT手边,您正在使用Light.intensityLight类没有任何名为intensity的静态成员,因此错误。

将您的代码更改为

else {
    GetComponent<Light>().intensity = Mathf.Lerp (GetComponent<Light>().intensity, 0f, fadeSpeed * Time.deltaTime);
}

你的错误应该消失。

以这种方式思考。你可以单独改变每个灯的强度,对吗?因此,它必须是类的实例的成员,而不是类本身。

如果更改单个值会影响使用它的所有内容(例如Physics.gravity),那么这些是类的静态成员。记住这一点,你不会弹出这个问题。