我正在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);
}
}
答案 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'