2015-01-31 3 views
0


나는이 질문을 여러 번 물어 봤지만 대답 (또는 적어도 내가 그들을 빼앗은 것)은 내 particiular 문제에 도움이되지 않았다.동적으로 변수 경로의 일부를 변경합니다.

변수 경로의 일부를 동적으로 변경하려고하므로 동일한 코드를 두 번 문자가 바뀌면서 x 번 반복하지 않아도됩니다. 여기

내가 가지고 무엇을 : 내 스크립트의 시작 부분에서

, 난이 같은 GameManager 객체에 부착 PlayerData 스크립트에 대한 참조, 설정 해요 : 나중에

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 변수를 사용하여 이러한 스크립트 액세스 : 내가 두려워, 나는이 PlayerEnergy 유니티의 일부가 아니라고 말하는 오류를 가지고

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 
} 

Engine.String.

그럼 어떻게 "currentPlayer"를 변수 경로의 일부로 읽을 수 있습니까?
아마도 일부 구문 분석 함수를 찾지 못했습니까?
아니면 완전히 잘못된 길로 가려고합니까?

건배

PS :
if (PlayerData[CurrentPlayerInt].PlayerEnergy >= value){ // do stuff }
없는 성공 : 또한 배열에 P1 및 P2 변수를 넣고 같이 그 액세스 시도. 모든

+0

정말 할 방법이 없습니까? 아니면 대답이 너무 기초적인 것인가? 나 혼자서 알아 내야 했는가? (나는 그렇지 않다.) 각 경우에 하나의 변수가 변경되는 함수의 경우 사람들이 끝없는 글을 쓰는 것을 매우 의심한다 ... – Tuxedomask

+0

한 가지 방법은, _currentPlayer_ var에 대한 경로를 직접 바인딩하는 것이라고 생각했다. if (currentplayerCount == 1) {currentPlayer = GameObject.Find ("GameManager"). GetComponent. ();}'각 플레이어에 대해. 하지만 _currentPlayer_에 대한 유형을 설정하지 않으면 오류가 발생합니다. currentPlayer를 선언 할 변수의 유형은 무엇입니까? – Tuxedomask

답변

0

- 그럼, 어쩌면이 도움이 될 수 있습니다.

PlayerData 스크립트를 미리 쓰는 대신 Playermanager 스크립트에서 public class 함수를 사용하여 생성합니다. Playerdata가 배열에 저장된 첨부 된 스크립트로 생성됩니다.
그런 다음 Playermanager.Playerlist[Playernumber].targetvariable을 통해 액세스 할 수 있습니다.
Playerdata가 게임 개체 대신 스크립트에 첨부 된 경우에만 수행하고 싶은 작업이 있습니다. 그리고 그것은 훌륭하게 작동합니다!

보시다시피
//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>(); 

} 

, 당신은이 클래스에서 어떤 타입의 변수를 넣을 수 있습니다 :

은 여기 내 Playermanager 스크립트의 전체 코드입니다.
같은 문제가있는 사람들에게 도움이되기를 바랍니다.

건배, Tux

1

첫째,

var에 currentPlayer : 문자열 = "P1"

여기 P1은 문자열, 두 개의 스크립트를 참조합니다하지 이전 P1/P2이다. 당신이 원하는 경우에 따라서, 사용자가 변경할 수있는

currentPlayer.PlayerEnergy> = 값

P1.PlayerEnergy> = 값

또는

P2.PlayerEnergy> = 값

하지만 당신은 단지처럼 하나 개의 기능을 원하는 경우

currentPlayer.PlayerEnergy> = 먼저 P1에 currentPlayer를 설정 한 다음

값/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 
} 
+0

답장을 보내 주셔서 감사합니다. 불행히도 (다른 사람들을위한 속임수 일 수도 있지만) 내가 찾는 해결책이 아닙니다. PlayerData 스크립트에서 많은 변수를 다루고 있기 때문에, 똑같은 방식으로 다른 플레이어에게 변수 패스의 P1과 P2를 바꿀 수 있다면 정말 최고의 솔루션이 될 것입니다. 물론 모든 플레이어에 대해'if (currentPlayer == x) {// do stuff for x} '로 하드 코딩 할 수는 있지만 어떻게 든 잘못 될 것 같은 느낌이들 것입니다. 더 좋은 방법이 될 것입니다. . 또한, 더 많은 사람들이이 질문을하지 않는지 궁금합니다. 나는 여기서 뭔가 사소한 것을 간과하고 있는가? – Tuxedomask

관련 문제