例如:
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带来错误,因此我不确定这是否是正确的方法。
2条答案
按热度按时间von4xj4u1#
您正在使用Lambda operator初始化只读property。
变更
到
Guid.NewGuid是Guid结构的静态方法。
另见
堆栈溢出:C# how to create a Guid value?
q35jwt9p2#
试试看:
Unity不能序列化
Guid
,但它可以序列化字符串。因此,我们可以使用string
作为底层guid存储。Unity也可以序列化byte[]
,这将更有效,特别是在UniqueID被多次读取的情况下。上面的代码是最简单的实现和最容易理解的,如果你要序列化到JSON,那么字符串Id可能是最有帮助的。