unity3d 如何创建一个唯一的gui id,而不是每次在我的保存系统的State脚本中手动创建它?

9udxz4iz  于 2023-02-13  发布在  其他
关注(0)|答案(2)|浏览(458)

例如:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CrateState : MonoBehaviour, IStateQuery
{
    public Transform crateCap;
    public SaveLoad saveLoad;
    public bool hasOpened;

    private bool saveOnce = true;

    private State m_state = new State();

    public Guid UniqueId = new Guid();//=> Guid.Parse("D9687717-CEF7-4E6C-8318-20BCC51E0110");

    private class State
    {
        public bool open;
    }

    public string GetState()
    {
        return JsonUtility.ToJson(m_state);
    }

    public void SetState(string jsonString)
    {
        m_state = JsonUtility.FromJson<State>(jsonString);

        if (m_state.open)
        {
            crateCap.localRotation = Quaternion.Euler(90, 0, 0);

            hasOpened = true;
        }
        else
        {
            crateCap.localRotation = Quaternion.Euler(180, 0, 0);

            hasOpened = false;
        }
    }

    // Update is called once per frame
    void Update()
    {
        if (GetComponent<UnlockCrate>().HasOpened())
        {
            hasOpened = true;

            if (saveOnce)
            {
                StartCoroutine(saveLoad.SaveWithTime());
                saveOnce = false;
            }
        }
        else
        {
            hasOpened = false;
        }

        m_state.open = hasOpened;
    }
}

该行:

public Guid UniqueId = new Guid();

是:

public Guid UniqueId => Guid.Parse("D9687717-CEF7-4E6C-8318-20BCC51E0110");

但在Visual Studio的菜单中执行此操作有点烦人:Tools〉Create GUID〉然后生成一个新的guid并将其复制到脚本中。
我使用这个脚本库为每个对象我想保存它的状态。为此,我需要生成一个新的guid。
我试着把台词改成:

public Guid UniqueId = new Guid();

但在顶部出现错误:状态查询
CrateState未实现接口成员IStateQuery.UniqueId
这是IStateQuery类:

using System;

public interface IStateQuery
{
    string GetState();
    void SetState(string jsonString);

    Guid UniqueId { get; }
}

我不确定是否做示例象我现在做的是正确的方法和怎样ot修正错误.在另一方面我想要做一些更容易的到每一次产生一个新的guid号码而不是拷贝它手动到状态脚本.
我试着举一个新的例子:

public Guid UniqueId = new Guid();

但这会给IStateQuery带来错误,因此我不确定这是否是正确的方法。

von4xj4u

von4xj4u1#

您正在使用Lambda operator初始化只读property
变更

public Guid UniqueId => Guid.Parse("D9687717-CEF7-4E6C-8318-20BCC51E0110");

public Guid UniqueId => Guid.NewGuid();

Guid.NewGuid是Guid结构的静态方法。
另见
堆栈溢出:C# how to create a Guid value?

q35jwt9p

q35jwt9p2#

试试看:

[SerualizeField] private string _uniqueId = string.Empty;
public Guid UniqueId
{
    get
    {
        if (string.IsNullOrEmpty(_uniqueId))
            _uniqueId = Guid.NewGuid().ToString();
        return Guid.Parse(_uniqueId);
    }
}

Unity不能序列化Guid,但它可以序列化字符串。因此,我们可以使用string作为底层guid存储。Unity也可以序列化byte[],这将更有效,特别是在UniqueID被多次读取的情况下。上面的代码是最简单的实现和最容易理解的,如果你要序列化到JSON,那么字符串Id可能是最有帮助的。

相关问题