Unity将摄像机视角保存成Json文件方便读取使用

系列文章目录

unity工具



👉前言

有时候会用到给模型定位视角的(写死的那种,因为有时候人家就要那个视角,没有办法只能整个小工具来方便一下自己),所以写了一个动态保存视角的功能,方便使用,简单记录一下,不喜勿喷哦,
大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。
有问题 欢迎点赞评论哦.
下面就让我们进入正文吧 !


提示:以下是本篇文章正文内容,下面案例可供参考

👉一、设置环境

1.创建Plugins文件夹
2.把LitJson.dll文件放到Plugins文件夹里
3.创建UI 一个InputField 输入框 一个按钮Button

4.代码的界面设置如下(下面也有介绍)
在这里插入图片描述

👉二、代码如下

1.生成的json文件在特殊文件StreamingAssets里面,具体设置到那个文件夹里面可以自己设置,看你自己心情哦,自己满意就行了哦.
2.代码也不复杂,一个读取json数据到字典的方法,一个保存json格式数据的,具体往下看代码吧
3.代码如下:

using LitJson;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
/// <summary>
/// 保存数据为json
/// </summary>
public class CameraSaveLoad : MonoSingleton<CameraSaveLoad>
{
    public Transform cameraTransform; // 相机的Transform组件
    public string saveFileName = "camera_view.json"; // 保存文件的名称
    public InputField viewNameInput; // 用于输入视角名称的UI InputField
    public Button surebtn;   //保存视角的按钮
    public Dictionary<string, CameraView> CamerViewDic = new Dictionary<string, CameraView>();
    /// <summary>
    /// 1F相机位置
    /// </summary>
  
    private void Awake()
    {
        StartCoroutine(LoadDeviceDic());
    }
    // Start is called before the first frame update
    void Start()
    {            
        surebtn.onClick.AddListener(SaveCameraPosition);
    }
    public class CameraView
    {
        public string name;
        public string position;
        public string rotation;      
    }
    /// <summary>
    /// 解析数据 字符串转v3
    /// </summary>
    /// <param name="sVector"></param>
    /// <returns></returns>
    public Vector3 StringToVector3(string sVector)
    {
        // 移除字符串中的括号
        if (sVector.StartsWith("(") && sVector.EndsWith(")"))
        {
            sVector = sVector.Substring(1, sVector.Length - 2);
        }

        // 拆分字符串为单独的值
        string[] sArray = sVector.Split(',');

        // 创建Vector3并返回
        return new Vector3(
            float.Parse(sArray[0]),
            float.Parse(sArray[1]),
            float.Parse(sArray[2]));
    }
    /// <summary>
    /// 将输入的视角名称和当前摄像机的视角保存到json里面
    /// </summary>
    public void SaveCameraPosition()
    {
        string viewName = viewNameInput.text;
        
        if (!string.IsNullOrEmpty(viewName))
        {
            
            CameraView cameraView = new CameraView
            {
                name = viewName,
                position = cameraTransform.position.ToString(),
                rotation = cameraTransform.rotation.eulerAngles.ToString()
                

            };
            AddCameratrToDic(viewName, cameraView);
        }
    }
    /// 将数据保存为json
    public void AddCameratrToDic(string viewname, CameraView viewdate)
    {           
        if (!CamerViewDic.ContainsKey(viewname))
        {
            CamerViewDic.Add(viewname, viewdate);
            SaveCamerViewDicTojson(CamerViewDic);
        }
        else
        {
            CamerViewDic[viewname] = viewdate;
            SaveCamerViewDicTojson(CamerViewDic);
        }
    }

    public void Delel()
    {
        // string filePath = Path.Combine(Application.streamingAssetsPath, "example.txt");

        string filePath = Path.Combine(Application.persistentDataPath, "camera_view.json");

        // 检查文件是否存在
        if (File.Exists(filePath))
        {
            File.Delete(filePath);
            Debug.Log("文件已删除:" + filePath);
        }
    }

    public void SaveCamerViewDicTojson(Dictionary<string, CameraView> valuePairs)
    {
        JsonData jsonData = JsonMapper.ToJson(valuePairs);
        Regex reg = new Regex(@"(?i)\\[uU]([0-9a-f]{4})");
        var ss = reg.Replace(jsonData.ToString(), delegate (Match m) { return ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString(); });
        string filePath = Path.Combine(Application.streamingAssetsPath, "camera_view.json");
        File.WriteAllText(filePath, ss);
        Debug.Log("Dictionary data saved to: " + filePath);
    }
    /// <summary>
    /// 加载保存的相机视角数据到字典
    /// </summary>
    /// <returns></returns>
    public  IEnumerator LoadDeviceDic()
    {

        string filePath = Path.Combine(Application.streamingAssetsPath, "camera_view.json");
        var uri = new System.Uri(Path.Combine(Application.streamingAssetsPath, "camera_view.json"));
        UnityWebRequest request = UnityWebRequest.Get(uri);
        yield return request.SendWebRequest();
        if (request.isNetworkError)
        {
            Debug.Log(request.error);
        }
        else
        {
            string jsonStr = request.downloadHandler.text;
            CamerViewDic = JsonMapper.ToObject<Dictionary<string, CameraView>>(jsonStr);
        
        }     
    }


}


👉三、使用方法

1.具体使用,可以运行的时候输入,点击保存,
2.也可以在编辑器里设置摄像机位置,手动输入到json里面,都可以,
3.下次调用的时候直接传你设置的摄像机位置名称即可
第四种
在脚本里加上一个输入框组件(InputField)一个按钮组件(Button)
在这里插入图片描述

在这里插入图片描述
脚本设置如下图
在这里插入图片描述
设置完成就可以运行场景,摄像机移动到合适的位置,起个名字输入到输入框里,点击按钮保存即可

👉四、下次外部调用json里面的摄像机位置的时候如下代码方法

 /// <summary>
    /// 获取存在字典里面的摄像机位置
    /// </summary>
    /// <param name="name">存的位置名称</param>
    public void SeetCamerView(string name)
    {
       
        if (CameraSaveLoad.Instance.CamerViewDic.TryGetValue(name, out CameraSaveLoad.CameraView cameraViewdate))
        {
            if (cameraViewdate != null)
            {
                currentCamerTr = name;
                Vector3 po = CameraSaveLoad.Instance.StringToVector3(cameraViewdate.position);
                Vector3 ro = CameraSaveLoad.Instance.StringToVector3(cameraViewdate.rotation);
              //设置摄像机的位置和旋转
                GameManager.Instance.SettingCamera(po, ro);
            }

        }
    }

具体调用方法可以自己实现哦
欢迎点赞评论哦,感谢,私聊也是可以的

👉壁纸分享

请添加图片描述
请添加图片描述

👉总结

本次总结的就是保存摄像机位置方便使用的实现,有需要会继续添加新的
如能帮助到你,就帮忙点个关注吧,三连更好哦,谢谢
你的点赞就是对博主的支持,有问题记得留言评论哦!
不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心疼你的一切

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值