2013-06-20 142 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"); 
    } 


} 

现在,在for循环,我很简单,想看看数据是否越过。如果有效,“我是相机”应打印出4次。但事实并非如此。有什么我失踪或不正确?

+0

你有没有试过调试这个以确保你的方法被调用?你有两个组件在你场景中的同一个GameObject上吗? –

+0

我有。所有Debug.Logs都是我试图检查以确保所有内容都被调用的。同样是的,这两个脚本都在我场景中的同一个对象上。 – N0xus

+0

显而易见的问题是:你确定'StoreXMLValues()'在'GetCameraList()'之前被调用吗? –

回答

0

我怀疑问题是按脚本执行的顺序。您所有的逻辑都在组件的Start方法中,并且您不能保证HV_ReadSettingsFile.Start()将在HV_Camera.Start()之前运行。

最有可能的HV_Camera在您的设置列表填充之前先运行。可以在Unity IDE中为脚本设置优先顺序,以确保不会发生这种情况,尽管从开发人员的角度来看这有点不直观。

或者,您可以重构代码以确保代码以正确的顺序运行。例如,如果您制定公开方法HV_ReadSettingsFile.EnsureFileIsRead(),则可以从两个组件的Start()调用该方法。该方法应该使用一个标志来记录它是否已经运行,从而确保代码只运行一次,以及哪个组件需要它。