IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity3D编辑器拓展——通过模板创建Lua脚本的两种方式(二) -> 正文阅读

[游戏开发]Unity3D编辑器拓展——通过模板创建Lua脚本的两种方式(二)

上一篇文章介绍了第一种方式:??Unity3D编辑器拓展——通过模板创建Lua脚本的两种方式(一)_Supernova Kai的博客-CSDN博客

下面介绍第二种方式:

本文的有关代码转载自:Unity3D 扩展编辑器实现创建Lua脚本 - 知乎 (zhihu.com)

声明:本文转载已得到原文章作者同意,有兴趣的可以关注原作者的知乎账号。

Charlotte - 知乎 (zhihu.com)

直接附上代码:(代码后面的部分是我个人的一些理解,如有错误,欢迎指出)

using UnityEngine;
using System.Collections;
using UnityEditor.ProjectWindowCallback;
using System.IO;
using UnityEditor;
public class CreateLua
{
    [MenuItem("Assets/Create/Lua Script", false, 80)]
    public static void CreateNewLua()
    {
        ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,
            ScriptableObject.CreateInstance<CreateScriptAssetAction>(),
            GetSelectedPathOrFallback() + "/New Lua.lua",
            null,
            "Assets/Editor/Template/LuaComponent.lua"); //模板文件的路径
    }

    //获取Project界面选择的文件路径
    public static string GetSelectedPathOrFallback()
    {
        string path = "Assets";
        foreach (UnityEngine.Object obj in Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.Assets))
        {
            path = AssetDatabase.GetAssetPath(obj);
            if (!string.IsNullOrEmpty(path) && File.Exists(path))
            {
                path = Path.GetDirectoryName(path);
                break;
            }
        }
        return path;
    }
}
class CreateScriptAssetAction : EndNameEditAction
{
    public override void Action(int instanceId, string pathName, string resourceFile)
    {
        //创建资源
        UnityEngine.Object obj = CreateAssetFromTemplate(pathName, resourceFile);
        //高亮显示该资源
        ProjectWindowUtil.ShowCreatedAsset(obj);
    }

    /// <summary>
    /// 通过模板创建新文件
    /// </summary>
    /// <param name="pathName">新文件路径</param>
    /// <param name="resourceFile">模板的路径</param>
    internal static UnityEngine.Object CreateAssetFromTemplate(string pathName, string resourceFile)
    {
        string fullName = Path.GetFullPath(pathName); //获取要创建的资源的绝对路径

        //读取本地模板文件
        StreamReader reader = new StreamReader(resourceFile);
        string content = reader.ReadToEnd(); //读取到末尾
        reader.Close(); //关闭reader

        string fileName = Path.GetFileNameWithoutExtension(pathName); //获取新文件的文件名

        //替换模板中的#SCRIPTNAME#为脚本名
        content = content.Replace("#SCRIPTNAME#", fileName);

        //写入新文件
        StreamWriter writer = new StreamWriter(fullName, false, new System.Text.UTF8Encoding(false));
        writer.Write(content); //写入新的内容
        writer.Close(); //关闭writer

        //刷新本地资源
        AssetDatabase.ImportAsset(pathName);
        AssetDatabase.Refresh();
        return AssetDatabase.LoadAssetAtPath(pathName, typeof(UnityEngine.Object));
    }
}

? ? ? ? 上面代码的解释:

? ? ? ? 1、ProjectWindowUtil.StartNameEditingIfProjectWindowExists()方法

????????StartNameEditingIfProjectWindowExists是一个在ProjectWindowUtil中的公有方法,其作用是将焦点设置到某文件并进入重命名,因为我们知道当我们右键创建代码的时候除了会选中该代码文件,同时还是处于重命名代码的状态的,此时代码尚未编译,当我们结束重命名后才真正进入到上面代码中CreateScriptAssetAction的Action方法,

? ? ? ? 其定义如下:

public static void StartNameEditingIfProjectWindowExists(int instanceID, EndNameEditAction endAction, string pathName, Texture2D icon, string resourceFile)

? ? ? ? 参数:

? ? ? ? int instaceID:

? ? ? ? EndNameEditAction endAction:

? ? ? ? string pathName:新建文件的路径

? ? ? ? Texture2D icon:新文件的图标

? ? ? ? string resourceFile:模板的路径

? ? ? ? 这个方法的工作流程:通过ScriptableObject.CreateInstance<>()创建一个实例,并进入重命名? ? --》? 重命名结束时,会调用CreateScriptAssetAction的Action方法,并将pathName和resourceFile作为参数传给Action方法。(也就是说这个方法的第二个参数endAction可以理解为就是结束重命名时需要执行的一个回调,一个“行为”)

? ? ? ? 2、GetSelectedPathOrFallback方法

//获取Project界面选择的文件路径
public static string GetSelectedPathOrFallback()
{
    string path = "Assets";
    foreach (UnityEngine.Object obj in Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.Assets))
    {
        path = AssetDatabase.GetAssetPath(obj);
        if (!string.IsNullOrEmpty(path) && File.Exists(path))
        {
            path = Path.GetDirectoryName(path);
            break;
        }
    }
    return path;
}

? ? ? ? GetSelectedPathOrFallback方法用于Unity编辑器下获取当前选择的文件路径

? ? ? ?

????????Selection.GetFiltered()方法? ??

? ? ? ? ?此方法用于获取当前选择的对象type参数为选择的对象类型,我们这里是Object,即所有的选择对象都会返回;mode参数用于进一步限制,我们这里mode是Selection.Assets,意思是仅返回Assets目录中的资源对象。

? ? ? ? 上面第五行代码通过GetFiltered方法获取所有选择的对象后,对找个Object[]进行遍历,获取到每一个obj,然后在用过第七行代码的AssetDatabase.GetAssetPath()方法获取该对象的路径

? ? ? ??AssetDatabase.GetAssetPath()方法通过传入资源对象本身,即可找到资源对象的路径

????????

? ? ? ? ?第八行代码,string.IsNullOrEmpty(path)判断路径是否为空,但是前面有一个取反!,

????????!string.IsNullOrEmpty(path) && File.Exists(path)这段条件的含义是,当路径不为空,并且这个路径已经有文件时,执行if语句中的内容:Path.GetDirectoryName(path)方法,返回指定目录的根目录,并且break。(当路径不为空并且路径已经存在文件的情况时,给path重新赋值给根目录,并且break出去;因为路径已有文件的话在这个路径创建文件会把原来的文件给覆盖了)

? ? ? ? 当不满足这个条件,也就是这个路径下没有文件的时候,返回这个路径。

? ? ? ? 3、CreateScriptAssetAction中的Action方法

? ? ? ? 逻辑很简单,就是简单的文件读写,写读取模板的内容,把内容存到一个string;然后创建一个新文件,把这个string写入,正则替换一下,保存文件,刷新资源就行了。

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-11-19 17:55:39  更:2021-11-19 17:56:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 23:39:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码