无法转换`object';表达式类型为“float';-”HealthParam.SetValue(Play

本文关键字:float Play HealthParam SetValue 类型 转换 object 表达式 | 更新日期: 2023-09-27 18:30:04

我正在Unity 5中进行一个演示音频项目,遇到了一些问题。我的目标是将currentHealth的值(包含在一个单独的"PlayerHealth"脚本中)分配给FMOD中的一个参数,该参数随着播放器的健康状况降低而调节音乐(使其更强烈)。无论如何,我不是一个程序员,但为了在Unity 5中实现音乐,我不得不把手弄脏。

HealthParam.setValue (PlayerHealth.currentHealth);

这行代码让Unity很不高兴。我认为这可能与静态成员和实例成员之间的差异有关,但我又不是程序员,真的不知道如何深入研究这方面的问题。

错误为:

"参数#1' cannot convert对象"表达式到类型"float"

"最佳重载方法匹配`FMOD.Studio.ParameterInstance.setValue(float)"有一些无效arguments"

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

}

无法转换`object';表达式类型为“float';-”HealthParam.SetValue(Play

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

我想你真正想要的是

HealthParam.setValue(playerHealth.currentHealth);

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

通过使用PlayerHealth.currentHealth,您建议有一个名为currentHealth的类成员(static),它显然不存在。使用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;

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

错误的描述说明了一切。您试图访问一个实例成员,但在行中没有提供对象引用。

HealthParam.setValue (PlayerHealth.currentHealth);

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

HealthParam.setValue (playerHealth.currentHealth);

在使用playerHealth变量之前,只需确保该变量已正确初始化(初始化已在wake方法中注释完毕)。

我认为您想将Update函数更改为以下内容:

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

问题:您是否正在尝试"HealthParam.setValue(currentHealth)",其中"currentHealth"是"MusicManager"类的"int"字段?如果没有,类"PlayerHealth"是否有一个公共字段"currentHealth"?如果类"PlayerHealth",你能显示API吗?如果是,请查看如何将int转换为float用于将"int"转换为"float"