2013-06-20 3 views
1

Я пытаюсь сделать камеру в Unity через внешний файл настроек. На данный момент у меня есть этот файл, который считывается и его значения сохраняются следующим образом:Обмен данными в списке между двумя классами

public struct Entry 
{ 
    public System.Object value; 
    public Type type; 
} 

public class HV_ReadSettingsFile : MonoBehaviour 

{ 
    Entry _screenEntry; 
    Entry _cameraEntry; 


public Dictionary<string, Entry> cameraDictionary = new Dictionary<string, Entry>(); 
public List<HV_Camera> cameraList = new List<HV_Camera>(); 
public List<HV_Screen> screenList = new List<HV_Screen>(); 




// Use this for initialization 
void Start() 
{ 
    StoreXMLValues(); 

} 

// Update is called once per frame 
void Update() 
{ 
} 

void StoreXMLValues() 
{ 
    var xdoc = XDocument.Load(@"C:\\Test.xml"); 
    var screens = xdoc.Descendants("Screen"); 
    var cameras = xdoc.Descendants("Camera"); 


    foreach (var screen in screens) 
    { 
     HV_Screen _screen = new HV_Screen(); 
     _screen.Name = (string)screen.Element("Name").Attribute("Name"); 
     _screen.Tag = (string)screen.Element("ScreenTag").Attribute("Tag"); 
     _screen.XPOS = (string)screen.Element("LocalPosition").Attribute("X"); 
     _screen.YPOS = (string)screen.Element("LocalPosition").Attribute("Y"); 
     _screen.ZPOS = (string)screen.Element("LocalPosition").Attribute("Z"); 
     _screen.Width = (string)screen.Element("Width").Attribute("Width"); 
     _screen.Height = (string)screen.Element("Height").Attribute("Height"); 
     _screen.YAW = (string)screen.Element("Orientation").Attribute("YAW"); 
     _screen.PITCH = (string)screen.Element("Orientation").Attribute("PITCH"); 
     _screen.ROLL = (string)screen.Element("Orientation").Attribute("ROLL"); 



     //Debug.Log("Screen name: " + _screen.Name); 
     //Debug.Log("Screen tag: " + _screen.Tag); 
     //Debug.Log("Screen xpos: " + _screen.XPOS); 
     //Debug.Log("Screen ypos: " + _screen.YPOS); 
     //Debug.Log("Screen zpos: " + _screen.ZPOS); 
     //Debug.Log("Screen width: " + _screen.Width); 
     //Debug.Log("Screen height: " + _screen.Height); 
     //Debug.Log("Screen Yaw: " + _screen.YAW); 
     //Debug.Log("Screen Pitch: " + _screen.PITCH); 
     //Debug.Log("Screen Roll: " + _screen.ROLL); 
     screenList.Add(_screen); 
    } 

    foreach (var camera in cameras) 
    { 
     HV_Camera _camera = new HV_Camera(); 
     _camera.Name = (string)camera.Element("Name").Attribute("Name"); 
     _camera.Tag = (string)camera.Element("CameraTag").Attribute("Tag"); 
     _camera.XPOS = (string)camera.Element("LocalPosition").Attribute("X"); 
     _camera.YPOS = (string)camera.Element("LocalPosition").Attribute("Y"); 
     _camera.ZPOS = (string)camera.Element("LocalPosition").Attribute("Z"); 
     _camera.YAW = (string)camera.Element("Orientation").Attribute("Yaw"); 
     _camera.PITCH = (string)camera.Element("Orientation").Attribute("Pitch"); 
     _camera.ROLL = (string)camera.Element("Orientation").Attribute("Roll"); 
     _camera.Near = (string)camera.Element("Near").Attribute("Near"); 
     _camera.Far = (string)camera.Element("Far").Attribute("Far"); 
     _camera.FOV = (string)camera.Element("FOV").Attribute("FOV"); 
     _camera.AspectRatio = (string)camera.Element("AspectRatio").Attribute("AspectRatio"); 
     _camera.ScreenDistance = (string)camera.Element("ScreenDistance").Attribute("ScreenDistance"); 

     // Debug.Log("Camera name: " + _camera.Name); 
     cameraList.Add(_camera); 

    } 

    //Debug.Log("Camera Count: " + cameraList.Count); 

    //Debug.Log("Screen Count: " + screenList.Count); 
} 

public List<HV_Camera> GetCameraList() 
{ 
    // Debug.Log("Got list"); 
    return cameraList; 
} 

Я проверил это с закомментированным Debug.Logs, и я знаю, что мой файл настройки становится читать и значение сохраняются.

В моем классе HV_Camera я пытаюсь получить доступ к данным в списке CameraList. Это то, что у меня есть:

 HV_ReadSettingsFile settings; 
     List<HV_Camera> testCamera = new List<HV_Camera>(); 

void Start() 
{ 
    settings = gameObject.GetComponent<HV_ReadSettingsFile>(); 
GetList(); 
    CreateCamera(); 
} 

// Update is called once per frame 
void Update() 
{ 

} 


public void GetList() 
{ 
    testCamera = settings.GetCameraList(); 


} 

public void CreateCamera() 
{ 

    for (int i = 0; i < testCamera.Count; i++) 
    { 
     Debug.Log("I am camera"); 
    } 


} 

Теперь, в том, что цикл, я просто хотел, чтобы увидеть, если данные становится переданы. Если он работает, «я камера» должен быть распечатан 4 раза. Но это не так. Есть что-то, что я упускаю или не делаю правильно?

+0

Вы пробовали отлаживать это, чтобы быть уверенным, что ваши методы вызывают? И у вас есть оба компонента на одном и том же GameObject в вашей сцене? –

+0

У меня есть да. Все Debug.Logs - это мои попытки проверить, чтобы все вызывалось так, как должно. И снова да, оба сценария находятся на одном и том же объекте в моей сцене. – N0xus

+0

Очевидный вопрос: вы уверены, что 'StoreXMLValues ​​()' вызывается до 'GetCameraList()'? –

ответ

0

Я подозреваю, что проблема в порядке выполнения скрипта. Вся ваша логика находится в методах Start компонентов, и вы не гарантируете, что HV_ReadSettingsFile.Start() будет работать до HV_Camera.Start().

Скорее всего HV_Camera работает первым, прежде чем ваш список настроек будет заполнен. В сценариях Unity можно задать порядок приоритетов для обеспечения того, чтобы этого не произошло, хотя я считаю это немного неинтуитивным с точки зрения разработчика.

В качестве альтернативы вы можете изменить структуру своего кода, чтобы убедиться, что код запущен в правильном порядке. Например, если вы создали общедоступный метод HV_ReadSettingsFile.EnsureFileIsRead(), вы можете вызвать этот метод из Start() обоих компонентов. Метод должен использовать флаг для записи, будет ли он уже запущен, и, таким образом, обеспечить, чтобы код выполнялся ровно один раз и для того, что требует его компонент.

Смежные вопросы