无法转换`object'表达式为`float' - HealthParam.SetValue(PlayerHealth.currentHealth);

时间:2016-01-12 07:59:59

标签: c# unity3d monodevelop fmod

我正在Unity 5中处理演示音频项目并遇到一些问题。我的目标是将currentHealth的值(包含在单独的" PlayerHealth"脚本中)分配给FMOD中的参数,该参数随着播放器的健康状况降低而调制音乐(使其更加强烈)。我无论如何都不是程序员,但却被迫在Unity 5中实现音乐。

HealthParam.setValue (PlayerHealth.currentHealth);

这行代码让Unity不高兴。我已经收集到它可能与静态成员和实例成员之间的区别有关,但我再也不是程序员而且真的不知道如何深入研究杂草。

错误是:

  

"参数#1' cannot convert对象'表达式以键入`float'"

     

"最佳重载方法匹配   `FMOD.Studio.ParameterInstance.setValue(浮点)'有一些无效的   参数"

     

"访问非静态成员需要对象引用   `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);
}


}

4 个答案:

答案 0 :(得分:0)

好吧,PlayerHealth是一个类,实例变量playerHealth的类型为PlayerHealth

我想你真正想要的是

HealthParam.setValue(playerHealth.currentHealth);

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

通过使用PlayerHealth.currentHealth,您建议有一个名为static的类成员(currentHealth),这显然不存在。使用playerHealth.currentHealth可以访问当前所谓的PlayerHealth实例的值。

静态与非静态的短“半开发者”版本

类的每个成员变量可以是类变量(声明为static),也可以是实例变量(不带static)。可以在没有类的当前实例(使用new创建)的情况下访问类变量。实例变量(如名称所示)仅在您拥有该类的实例时才可用。

示例:

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

以下作品:

StaticVSNonStatic.StaticValue = 5;

以下内容不是:

StaticVSNonStatic.NonStaticValue = 5;

对于后者,您需要StaticVSNonStatic类的实例:

StaticVSNonStatic instance = new StaticVSNonStatic();
instance.NonStaticValue = 5;

请注意,类变量应该是一个例外,因为通常让类的实例具有遵循相同数据模型但包含不同数据的单独“记录”。

答案 1 :(得分:0)

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

HealthParam.setValue (PlayerHealth.currentHealth);

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

HealthParam.setValue (playerHealth.currentHealth);

确保 playerHealth 变量在使用之前已正确初始化(您已在唤醒方法中注释了初始化)。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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