C#访问者问题

时间:2014-06-04 10:45:36

标签: c# string unity3d

我正在尝试在Unity内的两个类之间传递一个字符串。通常我会将字符串设置为静态并直接访问它,但是,我需要在Unities检查器中修改此字符串,如果我将其设置为静态,则无法执行此操作。

我曾经使用过get和set一次或两次,但它已经有一段时间了,我生锈了。所以,我在我设置字符串的类中设置了我的代码:

public string pdfString;
private string pdfInstance;
public string PDF { get { return pdfInstance; } }

void Start()
    {
        UI.SetActive(false);
        pdfInstance = pdfString;
    }

公开pdfString是我在检查员中设置的内容。我创建了私有字符串,因为我认为get值在传递公共字符串时存在问题。我测试了这个,私有的返回正确的字符串。

现在,在课程中我试图传递字符串,我已经完成了以下操作:

public string pdfFile = "";
private SetSelectedInfo pdf;
void Start ()
{
    pdf = new SetSelectedInfo();
}

// Update is called once per frame
void Update () {
    pdfFile = pdf.PDF;
}

public void OpenPDFFile()
{
    System.Diagnostics.Process.Start(Application.dataPath + "/PDFS/" + pdfFile);
}

当我调出pdfFile值时,它返回null。有人能看出我在设置时做错了吗?

2 个答案:

答案 0 :(得分:1)

单身模式是强大的,但强大的力量带来了巨大的责任。它已被过度使用,特别是在游戏开发中,所以它当然应该小心处理。

如果您想要将其设置为静态的唯一原因是可以访问它,那么让我为您提供一种替代方法,以便对组件和Unity的检查器窗口进行优化。

public class SetSelectInfo : MonoBehaviour 
{
     public string PDF;

     public void OpenPDFFile()
     {
         System.Diagnostics.Process.Start(Application.dataPath + "/PDFS/" + pdfFile);
     }
}

现在,您可以在检查器中设置PDF字符串。然后在你想要引用它的任何类中,只需将它暴露给检查器,如下所示:

public AnyOtherClass : MonoBehavior
{
    public SetSelectInfo SelectInfo;

    void Start()
    {
         Debug.log(SelectInfo.PDF); // Do whatever you want here, or any other place in the script
    }
}

将此脚本附加到游戏场景中的GameObject后,如果游戏对象上有SetSelectInfo脚本,则可以将GameObject拖到检查器的插槽中并将它们链接在一起。

如果最后一部分对你没有意义,我可以制作一些照片然后发布。但它真的很简单,就像单击对象然后将另一个对象拖动到检查器的字段空间(您设置pdf字符串的相同位置)

答案 1 :(得分:0)

我个人总是试图用每个包含所有变量的场景的游戏对象来避免这种情况。

但是一个明显更清晰的解决方案是像Wiki所说的单身模式。它将确保没有其他对象将引用它。如果您不确定Singleton Pattern的工作原理如何阅读Jon Skeets - Implementing of Singleton PatternWikipedia Topic

您的代码应如下所示:

public class SetSelectedInfo : Singleton<SetSelectedInfo> 
{        
    public string pdfString;
    private string pdfInstance;
    public string PDF { get { return pdfInstance; } }

    protected SetSelectedInfo () 
    {

    } 

    void Start()
    {
        UI.SetActive(false);
        pdfInstance = pdfString;
    }
}

方法:

public void OpenPDFFile()
{
    string file = SetSelectedInfo.Instance.pdfFile;
    System.Diagnostics.Process.Start(Application.dataPath + "/PDFS/" + file);
}