无法将“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 convert
object' 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'
我正在使用 Unity 5 开发一个演示音频项目,遇到了一些问题。我的目标是将 currentHealth 的值(包含在单独的 "PlayerHealth" 脚本中)分配给 FMOD 中的一个参数,该参数随着玩家健康状况的降低而调节音乐(使其更强烈)。我无论如何都不是程序员,但被迫亲自动手在 Unity 5 中实现音乐。
HealthParam.setValue (PlayerHealth.currentHealth);
这行代码让Unity很不爽。我收集到它可能与静态成员和实例成员之间的区别有关,但我又不是程序员,真的不知道如何深入研究这个问题。
错误是:
"Argument
#1' cannot convert
object' 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'