Unity3D仿星露谷物语开发66之NPC存档
1、目标
保存NPC的位置信息。
2、修改NPCMovement.cs脚本
添加一个新方法来取消NPC移动,如果有NPC正在移动则取消之。
添加函数:
public void CancelNPCMovement(){npcPath.ClearPath();npcNextGridPosition = Vector3Int.zero;npcNextWorldPosition = Vector3.zero;npcIsMoving = false;if(moveToGridPositionRoutine != null){StopCoroutine(moveToGridPositionRoutine);}// Reset move animationResetMoveAnimation();// Clear event animationClearNPCEventAnimation();npcTargetAniamtionClip = null;// Reset idle animationResetIdleAnimation();// Set idle animationSetIdleAnimation();}
3、重写NPC.cs脚本
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;[RequireComponent(typeof(NPCMovement))]
[RequireComponent(typeof(GenerateGUID))]
public class NPC : MonoBehaviour, ISaveable
{private string _iSaveableUniqueID;public string ISaveableUniqueID { get { return _iSaveableUniqueID; } set { _iSaveableUniqueID = value; } }private GameObjectSave _gameObjectSave;public GameObjectSave GameObjectSave { get { return _gameObjectSave; } set { _gameObjectSave = value; } }private NPCMovement npcMovement;private void OnEnable(){ISaveableRegister();}private void OnDisable(){ISaveableDeregister();}private void Awake(){ISaveableUniqueID = GetComponent<GenerateGUID>().GUID;GameObjectSave = new GameObjectSave();}private void Start(){// get npc movement componentnpcMovement = GetComponent<NPCMovement>(); }public void ISaveableDeregister(){SaveLoadManager.Instance.iSaveableObjectList.Remove(this);}public void ISaveableRegister(){SaveLoadManager.Instance.iSaveableObjectList.Add(this);}public void ISaveableRestoreScene(string sceneName){// Nothing required here since on persistent scene}public void ISaveableStoreScene(string sceneName){// Nothing required here since on persistent scene}public GameObjectSave ISaveableSave(){// Remove current scene saveGameObjectSave.sceneData.Remove(Settings.PersistentScene);// Create scene saveSceneSave sceneSave = new SceneSave();// Create vector 3 serialisable dictonarysceneSave.vector3Dictionary = new Dictionary<string, Vector3Serializable>();// Create string dictionarysceneSave.stringDictionary = new Dictionary<string, string>(); // Store target grid position, target world position, and target scenesceneSave.vector3Dictionary.Add("npcTargetGridPosition", new Vector3Serializable(npcMovement.npcTargetGridPosition.x, npcMovement.npcTargetGridPosition.y,npcMovement.npcTargetGridPosition.z));sceneSave.vector3Dictionary.Add("npcTargetWorldPosition", new Vector3Serializable(npcMovement.npcTargetWorldPosition.x, npcMovement.npcTargetWorldPosition.y,npcMovement.npcTargetWorldPosition.z));sceneSave.stringDictionary.Add("npcTargetScene", npcMovement.npcTargetScene.ToString());// Add scene save to game objectGameObjectSave.sceneData.Add(Settings.PersistentScene, sceneSave);return GameObjectSave;}public void ISaveableLoad(GameSave gameSave){// Get game object sceneif(gameSave.gameObjectData.TryGetValue(ISaveableUniqueID, out GameObjectSave gameObjectSave)){GameObjectSave = gameObjectSave;// Get scene saveif(GameObjectSave.sceneData.TryGetValue(Settings.PersistentScene, out SceneSave sceneSave)){// if dictionaries are not nullif(sceneSave.vector3Dictionary != null && sceneSave.stringDictionary != null){// target grid positionif(sceneSave.vector3Dictionary.TryGetValue("npcTargetGridPosition", out Vector3Serializable savedNPCTargetGridPosition)){npcMovement.npcTargetGridPosition = new Vector3Int((int)savedNPCTargetGridPosition.x, (int)savedNPCTargetGridPosition.y, (int)savedNPCTargetGridPosition.z);npcMovement.npcCurrentGridPosition = npcMovement.npcTargetGridPosition;}// target world positionif(sceneSave.vector3Dictionary.TryGetValue("npcTargetWorldPosition", out Vector3Serializable savedNPCTargetWorldPosition)){npcMovement.npcTargetWorldPosition = new Vector3(savedNPCTargetWorldPosition.x, savedNPCTargetWorldPosition.y, savedNPCTargetWorldPosition.z);transform.position = npcMovement.npcTargetWorldPosition;}// target sceneif(sceneSave.stringDictionary.TryGetValue("npcTargetScene", out string savedTargetScene)){if(Enum.TryParse<SceneName>(savedTargetScene, out SceneName sceneName)){npcMovement.npcTargetScene = sceneName;npcMovement.npcCurrentScene = npcMovement.npcTargetScene;}}// Clear any current NPC movementnpcMovement.CancelNPCMovement();}}}}}
运行游戏
NPC走到Scene3_Cabin后点击Save Game。
然后重新Load Game,NPC出现在Scene3_Cabin里面。