首页 > 解决方案 > 创建新的 guid 实例或在 Visual Studio 工具中选择 > 创建 guid 有什么区别?

问题描述

在我的状态脚本中,我选择工具 > 创建 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));
    }
}

标签: c#unity3d

解决方案


取决于你想要什么,真的。

Visual Studio 工具旨在生成您可以随意使用的 guid。它不以任何方式与您的代码绑定。您当然可以将这些值用作应用程序的静态资源,因此它们在运行时将始终相同。

每当您的代码运行时,Guid.NewGuid都会生成一个新Guid值。即使对于同一个对象,它也将始终是动态的。你今天和明天运行同一个应用程序,你会得到不同的指导。

根据您的评论,我的理解是您确实在寻找一种更简单的方法来在代码编辑器中注入静态 guid 以唯一标识组件类型。如果是这种情况,请查看以下扩展:

https://marketplace.visualstudio.com/items?itemName=florians.InsertGUIDCommand

它将允许您使用SHIFT-ALT-G在代码中注入全新的 guid 值。它应该可以为您节省几次鼠标点击。;)


推荐阅读