2016-01-12 4 views
0

Я работаю над демонстрационным аудиопроектом в Unity 5 и сталкиваюсь с некоторыми проблемами. Моя цель - присвоить значение currentHealth (которое содержится внутри отдельного сценария «PlayerHealth») параметру в FMOD, который модулирует музыку (делает ее более интенсивной) по мере того, как здоровье игрока уменьшается. Я не программист, любые средства, но был вынужден пачкать руки, чтобы реализовать музыку в Unity 5.Невозможно преобразовать выражение `object 'для типа` float' - HealthParam.SetValue (PlayerHealth.currentHealth);

HealthParam.setValue (PlayerHealth.currentHealth); 

Эта строка кода делает Unity несчастным. Я понял, что это может иметь какое-то отношение к различию между членами static и экземпляром, но опять же я не программист и действительно не знаю, как вникать в сорняки.

Ошибки:

"Аргумент #1' cannot convert объекта 'выражение типа` поплавка'"

«Лучший перегруженный метод соответствие для `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); 
} 


} 
+2

@Пожалуйста, укажите определение класса HealthParam. – tchelidze

+0

Можете ли вы поделиться кодом класса «HealthParam»? –

ответ

0

Ну, PlayerHealth класс и экземпляр переменной playerHealth имеет тип PlayerHealth.

Я предполагаю, что вы действительно хотите

HealthParam.setValue(playerHealth.currentHealth); 

, который получит доступ к переменной экземпляра вместо класса. Вот что предлагает последнее сообщение об ошибке.

Используя PlayerHealth.currentHealth, вы предполагаете, что есть член класса (static) с именем currentHealth, которого, очевидно, не существует. Используя playerHealth.currentHealth, вы получаете доступ к значению текущего так называемого экземпляра PlayerHealth.

Short «пол-разработчик» версия статического против нестатической

Каждой переменной член класса может быть либо переменным класс (объявивший 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; 

Обратите внимание, что переменные класса действительно должны быть исключением, так как обычно точка наличия экземпляров класса имеет отдельные «записи», которые следуют одной и той же модели данных, но содержат разные данные.

+0

Благодарим вас за это объяснение. Технически, поэтому код не компилируется. Однако была большая проблема, которая не позволяла коду функционировать, как я предполагал. Несмотря на то, что изменения «PlayerHealth» на «playerHealth» исправили ошибки, код по-прежнему не использовал правильное значение «currentHealth». Следовательно, музыка не менялась по отношению к здоровью игрока. –

+0

^Причина этого, и я все еще сбиваюсь с толку об этом, заключается в том, что были два скрипта «PlayerHealth». Поскольку это был учебный проект, оригинальные разработчики включали 2 копии каждого скрипта в игре. Следовательно, при вызове «PlayerHealth» в моем скрипте MusicManager он будет вызывать сценарий, который не использовался в сцене. В версии «PlayerHealth», которая была присоединена, было пространство имен в коде, и я просто должен был включить это пространство имен при вызове сценария. Несмотря на то, что это было простое решение, это была настоящая боль, чтобы понять. –

0

Описание ошибки говорит обо всем. Вы пытаетесь получить доступ к элементу экземпляра без предоставления ссылки на объект в своей строке.

HealthParam.setValue (PlayerHealth.currentHealth); 

Я не знаю, что ваш код PlayerHealth выглядит, но я думаю, что вам нужно изменить это:

HealthParam.setValue (playerHealth.currentHealth); 

Просто убедитесь, что ваш playerHealth переменная инициализирован перед использованием (у вас есть инициализация, прокомментированная в awake).

0

Я думаю, что вы хотите изменить свою функцию Update следующим:

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

Вопросы: Вы пытаетесь "HealthParam.setValue (currentHealth)", где "currentHealth" является поле 'INT' класса «MusicManager»? если нет, то у класса «PlayerHealth» есть общедоступное поле «currentHealth»? Можете ли вы показать API, если класс «PlayerHealth»? если да, см. how to convert int to float для преобразования 'int' в 'float'

+0

Мне жаль это говорить, но это действительно должен быть комментарий. Пожалуйста, перефразируйте это, чтобы ответить, а не задавать вопросы. –