c# - 创建新的 guid 实例或在 Visual Studio 工具中选择 > 创建 guid 有什么区别?
问题描述
在我的状态脚本中,我选择工具 > 创建 GUID > 新 GUID > 复制
脚本现在看起来像这样:
该指南与屏幕截图中的不同,仅作为示例。
问题是,在我想添加到此状态脚本格式的每个对象上,我需要手动生成一个新的 GUID,将其复制并粘贴到代码中,这有点烦人。所以我想知道创建新的 guid 实例或在 Visual Studio 工具中选择 > 创建指南有什么区别。
这是在创建新实例时:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GenerateGuid : MonoBehaviour
{
public string uniqueGuidID;
private Guid guidID;
public void GenerateGuidNum()
{
guidID = Guid.NewGuid();
uniqueGuidID = guidID.ToString();
}
}
我想知道为什么不在这两种情况下都使用相同的新实例技术,为什么创建指南号 5 的工具是为了什么?
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StateTest : MonoBehaviour, IStateQuery
{
private State m_state = new State();
public Guid UniqueId => Guid.Parse("571E6219-DFD4-4893-A3B0-F9A151BFABFE");
private class State
{
public bool s1;
// bool the kid holding the navi is true
}
public string GetState()
{
return JsonUtility.ToJson(m_state);
}
public void SetState(string jsonString)
{
m_state = JsonUtility.FromJson<State>(jsonString);
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
我将编辑和更新它的用法:
使用此脚本:
using System;
public interface IStateQuery
{
string GetState();
void SetState(string jsonString);
Guid UniqueId { get; }
}
在 TestState 脚本中,我使用的是 IStateQuery :
public class StateTest : MonoBehaviour, IStateQuery
然后在 Save 和 Load 方法中像这样使用它:
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class SaveLoad : MonoBehaviour
{
public FadeInOutSaveGameText fadeInOutSaveGame;
public float timeToStartSaving;
public float savingFadeInOutTime;
private string saveString;
private void Awake()
{
SaveSystem.Init();
}
public void Save(string Folder, string FileName)
{
var objectsToSave = UpdateObjectsToSave();
SaveGame saveGame = new SaveGame();
saveGame.saveObjects = new List<SaveObject>();
for (int i = 0; i < objectsToSave.Count; i++)
{
SaveObject saveObject = new SaveObject();
saveObject.transformSaver = new TransformSaver();
Debug.Log($"{i}");
Debug.Log($"{objectsToSave[i].name}");
saveObject.gameObjectUniqueID = objectsToSave[i].GetComponent<GenerateGuid>().uniqueGuidID;
var x = objectsToSave[i].GetComponents<Component>();
var stateQueryComponent = x.Where(component => component is IStateQuery).ToList();
List<KeyToValue> componentsState = new List<KeyToValue>();
foreach (var z in stateQueryComponent)
{
var w = z as IStateQuery;
componentsState.Add(new KeyToValue(w.UniqueId.ToString(), w.GetState()));
}
saveObject.transformSaver.position = objectsToSave[i].transform.position;
saveObject.transformSaver.rotation = objectsToSave[i].transform.rotation;
saveObject.transformSaver.scaling = objectsToSave[i].transform.localScale;
saveObject.componentsState = componentsState;
saveGame.saveObjects.Add(saveObject);
}
string json = JsonUtility.ToJson(saveGame);
if (Folder == null && FileName == null)
{
SaveSystem.Save(json);
}
else
{
SaveSystem.Save(Folder, FileName, json);
}
}
public void Load(string Folder, string FileName)
{
var objectsToLoad = UpdateObjectsToSave();
Dictionary<string, GameObject> uniqueIdToObject = objectsToLoad
.ToDictionary(o => o.GetComponent<GenerateGuid>().uniqueGuidID, o => o);
saveString = SaveSystem.Load(Folder, FileName);
if (saveString != null)
{
SaveGame saveGame = JsonUtility.FromJson<SaveGame>(saveString);
foreach (var saveObject in saveGame.saveObjects)
{
List<KeyToValue> loadedComponents = saveObject.componentsState;
if (uniqueIdToObject.ContainsKey(saveObject.gameObjectUniqueID))
{
var objectToSetState = uniqueIdToObject[saveObject.gameObjectUniqueID];
objectToSetState.transform.position = saveObject.transformSaver.position;
objectToSetState.transform.rotation = saveObject.transformSaver.rotation;
objectToSetState.transform.localScale = saveObject.transformSaver.scaling;
var y = objectToSetState.GetComponents<Component>();
var z = y.Where(component => component is IStateQuery).ToList();
Dictionary<string, IStateQuery> zz = z.ToDictionary(sq => (sq as IStateQuery).UniqueId.ToString(), sq => sq as IStateQuery);
foreach (KeyToValue keyvalue in loadedComponents)
{
zz[keyvalue.Key].SetState(keyvalue.Value);
}
}
}
}
}
private List<GameObject> UpdateObjectsToSave()
{
var objectsWithGenerateGuid = GameObject.FindObjectsOfType<GenerateGuid>().ToList();
var objectsToSave = new List<GameObject>();
if (objectsWithGenerateGuid.Count > 0 && objectsToSave.Count == 0)
{
for (int i = 0; i < objectsWithGenerateGuid.Count; i++)
{
objectsToSave.Add(objectsWithGenerateGuid[i].gameObject);
}
}
return objectsToSave;
}
public IEnumerator AuatomaticSaveWithTime()
{
yield return new WaitForSeconds(timeToStartSaving);
Save(null, null);
StartCoroutine(fadeInOutSaveGame.OverAllTime(savingFadeInOutTime));
}
public IEnumerator SaveWithTime(string Folder, string FileName)
{
yield return new WaitForSeconds(timeToStartSaving);
Save(Folder, FileName);
StartCoroutine(fadeInOutSaveGame.OverAllTime(savingFadeInOutTime));
}
}
解决方案
取决于你想要什么,真的。
Visual Studio 工具旨在生成您可以随意使用的 guid。它不以任何方式与您的代码绑定。您当然可以将这些值用作应用程序的静态资源,因此它们在运行时将始终相同。
每当您的代码运行时,Guid.NewGuid
都会生成一个新Guid
值。即使对于同一个对象,它也将始终是动态的。你今天和明天运行同一个应用程序,你会得到不同的指导。
根据您的评论,我的理解是您确实在寻找一种更简单的方法来在代码编辑器中注入静态 guid 以唯一标识组件类型。如果是这种情况,请查看以下扩展:
https://marketplace.visualstudio.com/items?itemName=florians.InsertGUIDCommand
它将允许您使用SHIFT-ALT-G
在代码中注入全新的 guid 值。它应该可以为您节省几次鼠标点击。;)
推荐阅读
- velocity - 在使用无服务器框架设置 AppSyncAPI 时,是否可以在单个文件中包含多个速度模板?
- angular - 以角度显示 5x5 表格中的数字数组
- javascript - 从A页面点击一个按钮打开一个新的页面B,当关闭页面B时,页面A从B获取一个参数而不刷新。可以吗?
- kotlin - 如何使用 Flutter 和 kotlin 在应用程序之外拥有小部件
- tcp - 持续在线连接到服务器
- openapi - 如何使 OpenAPI 从现有类中选择依赖项
- python - UpdateView 不使用现有数据填充表单
- ruby-on-rails - Rails 控制器:重定向警报显示文本但不显示错误字符串
- ios - 格式化后从文本字段中获取双倍值
- mysql - MySQL - 在一条语句中从查询中更新表字段