【问题标题】:C# Accessors issueC# 访问器问题
【发布时间】:2014-07-24 23:33:45
【问题描述】:

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

我之前使用过一两次 get 和 set,但已经有一段时间了,我已经生疏了。所以,我在设置字符串的类中设置了这样的代码:

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

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

Public pdfString 是我在检查器中设置的。我创建了私有字符串,因为我认为获取值在传递公共字符串时存在问题。我对此进行了测试,并且私有返回了正确的字符串。

现在,在我试图传递字符串的课程中,我做了以下事情:

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 值时,它返回一个空值。有人能看出我在设置时做错了什么吗?

【问题讨论】:

  • 什么是pdfFile?你还没有在任何地方声明过。
  • 尝试使用单例模式。问题是 pdf.PDF 将不是同一个对象。
  • 糟糕,忘记发了。它是公开的,因此我可以查看检查器中是否有任何内容传递给它。
  • 当你设置pdf = new SetSelectedInfo();是在创建一个新的PDF文档吗?
  • 据我所知,没有。 PDF 文档保存在一个文件夹中,当我单击该按钮时程序会打开该文件夹。我需要的是能够根据点击的内容打开多个 PDF。以上是我能想到的唯一方法。

标签: c# string unity3d


【解决方案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,您可以将 GameObject 拖到检查器上的插槽中并将它们链接在一起。

如果最后一部分对您来说没有意义,我可以制作一些图片并发布它们。但这真的很简单,只需单击对象然后将另一个对象拖到检查器上的字段空间中(与您设置 pdf 字符串的位置相同)

【讨论】:

  • 是的,我已经想到了这一点,但是因为我有 20 个对象,每个对象都有自己的 PDF,所以我不希望有 20 个不同的 PDF 按钮。上述工作虽然:)
【解决方案2】:

就我个人而言,我总是尽量避免这种情况,为每个包含所有变量的场景设置一个游戏对象。

但一个明显更清洁的解决方案是像Wiki 所说的单例模式。它将确保没有其他对象会引用它。如果您不确定单例模式的工作原理,请阅读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);
}  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多