动态改变变量路径的一部分
dynamically change a part of the variable path
我知道这个问题已经被问过很多次了,但是 none 的答案(或者至少是我从他们那里得到的答案)对我的特殊问题有所帮助。
我想动态更改变量路径的一部分,这样我就不必重复相同的代码 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 的一部分。
那么如何让 unity 读取 "currentPlayer" 作为变量路径的一部分?
也许我还没有找到一些解析函数?
还是我走错了路?
干杯
PS:我还尝试将 P1 和 P2 变量放入数组中并像这样访问它们:
if (PlayerData[CurrentPlayerInt].PlayerEnergy >= value){
// do stuff
}
没有成功。
首先,
var currentPlayer : String = "P1"
这里的P1只是字符串,不是前面的P1/P2,引用了两个脚本。所以,如果你愿意,你可以改变
currentPlayer.PlayerEnergy >= value
到
P1.PlayerEnergy >= value
或者,
P2.PlayerEnergy >= value
但是如果你只想要它们的一个功能,比如
currentPlayer.PlayerEnergy >= value
然后您必须首先将 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 脚本,而是使用 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>();
}
如您所见,您可以在此 class.
中放置任何类型的变量
希望对遇到同样问题的小伙伴有所帮助
干杯,
晚礼服
我知道这个问题已经被问过很多次了,但是 none 的答案(或者至少是我从他们那里得到的答案)对我的特殊问题有所帮助。
我想动态更改变量路径的一部分,这样我就不必重复相同的代码 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 的一部分。
那么如何让 unity 读取 "currentPlayer" 作为变量路径的一部分?
也许我还没有找到一些解析函数?
还是我走错了路?
干杯
PS:我还尝试将 P1 和 P2 变量放入数组中并像这样访问它们:
if (PlayerData[CurrentPlayerInt].PlayerEnergy >= value){
// do stuff
}
没有成功。
首先,
var currentPlayer : String = "P1"
这里的P1只是字符串,不是前面的P1/P2,引用了两个脚本。所以,如果你愿意,你可以改变
currentPlayer.PlayerEnergy >= value
到
P1.PlayerEnergy >= value
或者,
P2.PlayerEnergy >= value
但是如果你只想要它们的一个功能,比如
currentPlayer.PlayerEnergy >= value
然后您必须首先将 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 脚本,而是使用 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>();
}
如您所见,您可以在此 class.
中放置任何类型的变量
希望对遇到同样问题的小伙伴有所帮助
干杯, 晚礼服