1

我正在寻找一种将相同类型的变量存储在数组中并通过它们的名称访问它们的方法。就像在 PHP 中一样:

$array = array();
$array['first member']=$var1;
$array['another member']=$var2;
// so on

我想在 Unity3D 的 JavaScript 中做类似的事情。我有 AudioClip 变量,目前使用如下:

#pragma strict

var Audio_Goal:AudioClip;
var Audio_Miss:AudioClip;
var Audio_Saved:AudioClip;


function PlaySound_Goal()
{   
    audio.PlayOneShot(Audio_Goal);  
}

function PlaySound_Miss()
{   
    audio.PlayOneShot(Audio_Miss);  
}

当然,这需要每个音频剪辑一个功能,这很难看。

我想这样做:

function PlayAudio(audioname:String)
{
    audio.PlayOneShot(AudioArray[audioname]);
}

我怎样才能做到这一点?

4

3 回答 3

4

您需要使用字典之类的东西:

#pragma strict
import System.Collections.Generic;
var AudioArray = new Dictionary.<string,AudioClip >();

// add to dict
AudioArray["one"] = AudioClip.Create(/**/); //see AudioClip.Create(...) for arguments

// play from dict
audio.clip = AudioArray["one"];
audio.Play();
于 2013-08-02T17:30:41.540 回答
0

您应该能够使用 Enumerable.Zip>,但由于它在 UnityScript 中不可用,我认为这是您能做的最好的事情:

var names : List.<String>;
var clips : List.<AudioClip>;

var keyFunc = function(kvp : KeyValuePair.<String, AudioClip>) kvp.Key;
var valueFunc = function(kvp : KeyValuePair.<String, AudioClip>) kvp.Value;
var dictionary = names.Select( 
    function(name, index) new KeyValuePair.<String, AudioClip>(name, clips[index]) 
).ToDictionary(keyFunc, valueFunc);

我不知道你为什么需要存储 Funcs。此代码编译,但不会运行:

var dictionary = names.Select( 
        function(name, index) new KeyValuePair.<String, AudioClip>(name, clips[index]) 
    ).ToDictionary(function(kvp) kvp.Key, function(kvp) kvp.Value);

如果需要,将其报告为错误。我不想,因为我认为开发人员不需要在这种语言上浪费更多时间。

于 2013-08-03T02:14:45.310 回答
0

您可以执行以下操作:

var myAudioClips: AudioClip[];

function Start() {
    // Your stuff...
}

function PlayAudio(audioname:String)
{
    for (var myClip in myAudioClips) {
        if (audioname.Equals(myClip.name)) {
            audio.PlayOneShot(myClip);  
        }
    }

}

然后通过使用编辑器拖动它们将所有剪辑添加到数组中。

于 2013-08-02T17:46:46.620 回答