无法将“object”表达式转换为“float”类型 - HealthParam.SetValue (PlayerHealth.currentHealth);

Cannot convert `object' expression to type `float' - HealthParam.SetValue (PlayerHealth.currentHealth);

我正在使用 Unity 5 开发一个演示音频项目,遇到了一些问题。我的目标是将 currentHealth 的值(包含在单独的 "PlayerHealth" 脚本中)分配给 FMOD 中的一个参数,该参数随着玩家健康状况的降低而调节音乐(使其更强烈)。我无论如何都不是程序员,但被迫亲自动手在 Unity 5 中实现音乐。

HealthParam.setValue (PlayerHealth.currentHealth);

这行代码让Unity很不爽。我收集到它可能与静态成员和实例成员之间的区别有关,但我又不是程序员,真的不知道如何深入研究这个问题。

错误是:

"Argument #1' cannot convertobject' expression to type `float'"

"The best overloaded method match for `FMOD.Studio.ParameterInstance.setValue(float)' has some invalid arguments"

"An object reference is required to access non-static member `PlayerHealth.currentHealth'"

这是脚本:

using UnityEngine;
using System.Collections;

public class MusicManager : MonoBehaviour 
{


public int startingHealth = 100;                            
public int currentHealth;
public PlayerHealth playerHealth;
GameObject player; 

[FMODUnity.EventRef]
public string ScaryMusic = "event:/ZombunnyHorrorMusic";
FMOD.Studio.EventInstance MusicEv;
FMOD.Studio.ParameterInstance HealthParam;


void awake()
{
//      player = GameObject.FindGameObjectWithTag ("Player");
//      playerHealth = player.GetComponent <PlayerHealth> ();
}

void Start () 
{
    MusicEv = FMODUnity.RuntimeManager.CreateInstance (ScaryMusic);
    MusicEv.getParameter ("Health", out HealthParam);
    MusicEv.start ();
}

void update()
{
//      currentHealth = Mathf.Abs (PlayerHealth.currentHealth);
    HealthParam.setValue (PlayerHealth.currentHealth);
}

void OnDestroy ()
{
    MusicEv.stop (FMOD.Studio.STOP_MODE.IMMEDIATE);
}


}

嗯,PlayerHealth 是一个 class,实例变量 playerHealth 的类型是 PlayerHealth

我猜你真正想要的是

HealthParam.setValue(playerHealth.currentHealth);

这将访问实例变量而不是 class。这就是最后一条错误消息所暗示的。

通过使用 PlayerHealth.currentHealth 你暗示有一个名为 currentHealth 的 class 成员 (static),这显然不存在。使用 playerHealth.currentHealth 您可以访问当前所谓的 PlayerHealth.

实例的值

简短的 "semi-developer" 静态版本与 non-static

class 的每个成员变量可以是 class 变量(声明为 static)或实例变量(没有声明 static)。 class 变量可以在没有 class 的当前实例(使用 new 创建)的情况下访问。实例变量(顾名思义)只有在手头有 class 的实例时才可用。

示例:

public class StaticVSNonStatic
{
    public static int StaticValue;
    public int NonStaticValue;
}

以下作品:

StaticVSNonStatic.StaticValue = 5;

以下没有:

StaticVSNonStatic.NonStaticValue = 5;

对于后者,您需要一个 StaticVSNonStatic class:

的实例
StaticVSNonStatic instance = new StaticVSNonStatic();
instance.NonStaticValue = 5;

请注意,class 变量确实应该是一个例外,因为通常拥有 class 实例的意义在于拥有单独的 "records" 遵循相同的数据模型,但是包含不同的数据。

错误的描述说明了一切。您正在尝试访问实例成员而不在您的行中提供对象引用。

HealthParam.setValue (PlayerHealth.currentHealth);

我不知道您的 PlayerHealth 代码是什么样的,但我认为您需要将其更改为:

HealthParam.setValue (playerHealth.currentHealth);

只需确保您的 playerHealth 变量在使用前已正确初始化(您已在 awake 方法中注释掉初始化)。

我认为您想将更新功能更改为以下内容:

void update() {
    HealthParam.setValue (playerHealth.currentHealth);
}

问题: 您是否正在尝试“HealthParam.setValue(currentHealth)”,其中 "currentHealth" 是 class "MusicManager" 的 'int' 字段? 如果不是,class "PlayerHealth" 是否有 public 字段 "currentHealth"?如果 class "PlayerHealth" 可以显示 API 吗? 如果是,请参阅 how to convert int to float 用于将 'int' 转换为 'float'