【问题标题】:dynamically change a part of the variable path动态改变变量路径的一部分
【发布时间】:2015-03-30 23:47:27
【问题描述】:


我知道这个问题已经被问过很多次了,但没有一个答案(或者至少我从他们那里得到的答案)对我的特殊问题没有帮助。

我想动态更改变量路径的一部分,因此我不必重复相同的代码 x 次,只需更改两个字符。

这是我得到的:

在脚本的开头,我设置了对 PlayerData 脚本的引用,附加到 GameManager 对象,如下所示:

var P1 : P1_Data;
var P2 : P2_Data;

function Start(){
    P1 = GameObject.Find("GameManager").GetComponent.<P1_Data>();
    P2 = GameObject.Find("GameManager").GetComponent.<P2_Data>();
}

稍后,我想使用 currentPlayer 变量访问这些脚本以动态调整路径:

 var currentPlayer : String = "P1"; //this actually happens along with some other stuff in the SwitchPlayers function, i just put it here for better understanding

 if (currentPlayer.PlayerEnergy >= value){
 // do stuff
 }

因为我害怕,我收到一条错误消息,说 PlayerEnergy 不是 UnityEngine.String 的一部分。

那么如何统一读取“currentPlayer”作为变量路径的一部分?
也许我还没有找到一些解析函数?
还是我在这里走错了路?

干杯

PS:我还尝试将 P1 和 P2 变量放入一个数组并像这样访问它们:
if (PlayerData[CurrentPlayerInt].PlayerEnergy >= value){ // do stuff }
没有成功。

【问题讨论】:

  • 真的没有办法吗?还是答案如此基本,以至于我应该自己弄清楚? ( 我没有
  • 我想到的一种方法是直接将路径绑定到 currentPlayer 变量,例如每个玩家的if (currentplayerCount == 1){currentPlayer = GameObject.Find("GameManager").GetComponent.&lt;P1_Data&gt;();}。但是当我没有为 currentPlayer 设置类型时,我得到一个错误。我在这里声明 currentPlayer 是什么类型的变量?

标签: variables unity3d unityscript


【解决方案1】:

首先,

var currentPlayer : String = "P1"

这里的 P1 只是字符串,而不是之前的 P1/P2 引用了两个脚本。所以,如果你愿意,你可以改变

currentPlayer.PlayerEnergy >= 值

P1.PlayerEnergy >= 值

或者,

P2.PlayerEnergy >= 价值

但如果你只想为他们提供一个功能,比如

currentPlayer.PlayerEnergy >= 值

然后您必须首先将 currentPlayer 设置为 P1/P2,我假设您正在尝试这样做。您必须有一些代码可以验证选择了哪个播放器。那么,也许这会有所帮助 -

var playerSelected: int = 0;
var currentPlayerEnergy: int = 0;

.....

//Use your codes to verify which player is selected and then,

if (playerSelected == 1) {
    currentPlayerEnergy = P1.PlayerEnergy;
} else if (playerSelected == 2) {
    currentPlayerEnergy = P2.PlayerEnergy;
}

//Now use your favorite function
if (currentPlayerEnergy >= value) {
//Do stuff
}

【讨论】:

  • 感谢您的回复。不幸的是(虽然它可能对其他人有用)这不是我正在寻找的解决方案。由于我在 PlayerData 脚本中处理了很多变量,对于不同的玩家以完全相同的方式,如果我可以在变量路径中将 P1 与 P2 交换,那将是最好的解决方案。我当然可以为所有玩家使用if (currentPlayer == x){//do stuff for x} 对其进行硬编码,但这会感觉有点不对劲……必须有更好的方法来做到这一点。另外,我想知道怎么没有更多的人问这个问题。我在这里忽略了一些微不足道的事情吗?
【解决方案2】:

由于没有回复提供我需要的答案,我将分享一个同学提供的解决方案,为我解决问题。

我没有预先编写 PlayerData 脚本,而是使用 Playermanager 脚本中的 public class 函数生成它们。这会将 Playerdata 生成为附加脚本,并保存到数组中。
然后我可以通过Playermanager.Playerlist[Playernumber].targetvariable 访问它们。
这就是我想要做的,只是将 Playerdata 附加到脚本而不是游戏对象。而且效果很好!

这是我的 Playermanager 脚本的完整代码:

//initialise max players
public var maxplayers : int = 2;

// Initialise Playerlist
static var Players = new List.<PlayerData>();


function Start () {
 for (var i : int = 0; i < maxplayers; i++){ 
     var Player = new PlayerData();
     Players.Add(Player);
     Players[i].PlayerName = "Player " + i; 
 }  

 DontDestroyOnLoad (transform.gameObject);   
 }

public class PlayerData {

  public var PlayerName : String;
  public var PlayerEnergy : int = 15; 
  public var Fleet : List.<GameObject> = new List.<GameObject>(); 

}

如您所见,您可以在此类中放置任何类型的变量。
我希望这对你们中的一些有同样问题的人有所帮助。

干杯, 无尾礼服

【讨论】:

    猜你喜欢
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多