首页 > 其他分享 >在Unity中快速生成基于模板的Lua脚本

在Unity中快速生成基于模板的Lua脚本

时间:2024-02-03 22:11:19浏览次数:26  
标签:string lua private Lua Unity txt 模板

在学习Xlua时,这个工具提供了一个简单而强大的方式来快速生成基于模板的Lua脚本,有助于提高开发效率和保持代码的一致性。

1.xlua框架导入
在GitHub上搜索xlua,找到腾讯的xlua项目,下载项目的压缩包。然后将压缩包里的Plugins和XLua这两个文件夹导入Unity的Assets目录下,如下图所示:

2.XLua菜单选项
将这两个文件夹复制到Unity的Assets目录下后稍等一会儿,就会发现在菜单栏中Windows菜单选项左侧出现了XLua菜单选项,没有报错的话说明成功导入。如下图所示:

3.实现基于模板的Lua脚本的工具
3-1.首先在Assets目录下创建Editor目录,然后在Editor目录下创建CreateLuaScript目录,最后在CreateLuaScript目录下创建CreateLuaScript.cs脚本
3-2 CreateLuaScript.cs如下:


点击查看代码
```
using UnityEngine;
using UnityEditor;
using System.IO;
using System;

  /// <summary>
  /// Lua脚本创建工具,支持从模板创建Lua脚本。
  /// </summary>
  public class CreateLuaScript : EditorWindow
  {
      private string scriptName = ""; // 脚本名称
      private int selectedTemplateIndex = 0; // 选中的模板索引
      private string[] templateOptions = { "Basic Template", "Advanced Template" }; // 模板选项
      private string path; // 保存路径
      private bool isFocused = false; // 是否已聚焦到输入框

      /// <summary>
      /// 初始化窗口
      /// </summary>
      [MenuItem("Assets/Create/Lua Script", false, 80)]
      private static void Init()
      {
          var window = GetWindowWithRect<CreateLuaScript>(new Rect(0, 0, 350, 125), true, "Lua Script Creator");
          window.Setup();
      }

      /// <summary>
      /// 设置初始状态
      /// </summary>
      private void Setup()
      {
          path = GetSelectedPathOrFallback();
          isFocused = false;
      }

      /// <summary>
      /// 绘制用户界面
      /// </summary>
      void OnGUI()
      {
          EditorGUILayout.LabelField("Lua Script Name:", EditorStyles.boldLabel);
          GUI.SetNextControlName("ScriptNameTextField");
          scriptName = EditorGUILayout.TextField(scriptName).Trim();

          EditorGUILayout.LabelField("Select Template:", EditorStyles.boldLabel);
          selectedTemplateIndex = EditorGUILayout.Popup(selectedTemplateIndex, templateOptions);

          if (!isFocused)
          {
              EditorGUI.FocusTextInControl("ScriptNameTextField");
              isFocused = true;
          }

          Event e = Event.current;
          bool enterPressed = e.type == EventType.KeyDown && (e.keyCode == KeyCode.Return || e.keyCode == KeyCode.KeypadEnter);

          if (GUILayout.Button("Create") || enterPressed)
          {
              if (ValidateScriptName(scriptName))
              {
                  CreateScriptFromTemplate();
                  Close();
              }
          }
      }

      /// <summary>
      /// 验证脚本名称
      /// </summary>
      /// <param name="scriptName">脚本名称</param>
      /// <returns>是否有效</returns>
      private bool ValidateScriptName(string scriptName)
      {
          if (string.IsNullOrWhiteSpace(scriptName))
          {
              EditorUtility.DisplayDialog("Error", "Script name cannot be empty.", "OK");
              return false;
          }

          string fullPath = $"{path}{scriptName}.lua.txt";
          if (File.Exists(fullPath))
          {
              EditorUtility.DisplayDialog("Error", "A script with this name already exists.", "OK");
              return false;
          }

          return true;
      }

      /// <summary>
      /// 根据模板创建Lua脚本
      /// </summary>
      private void CreateScriptFromTemplate()
      {
          string templateContent = GetTemplateContentByIndex(selectedTemplateIndex);
          string fullPath = $"{path}{scriptName}.lua.txt";

          File.WriteAllText(fullPath, templateContent);
          AssetDatabase.Refresh();

          Debug.Log($"Lua script created: {fullPath}");
          EditorUtility.DisplayDialog("Success", $"Lua script \"{scriptName}.lua.txt\" created successfully.", "OK");
      }

      /// <summary>
      /// 获取选中模板的内容
      /// </summary>
      /// <param name="index">模板索引</param>
      /// <returns>模板内容字符串</returns>
      private string GetTemplateContentByIndex(int index)
      {
          string filePath = "";
          switch (index)
          {
              case 0:
                  filePath = "Assets/Editor/CreateLuaScript/LuaTemplates/BasicTemplate.lua.txt";
                  break;
              case 1:
                  filePath = "Assets/Editor/CreateLuaScript/LuaTemplates/AdvancedTemplate.lua.txt";
                  break;
              default:
                  filePath = "Assets/Editor/CreateLuaScript/LuaTemplates/DefaultTemplate.lua.txt";
                  break;
          }

          if (!File.Exists(filePath))
          {
              Debug.LogError("Template file not found: " + filePath);
              return "-- Template file not found";
          }

          try
          {
              string content = File.ReadAllText(filePath);
              return content;
          }
          catch (Exception ex)
          {
              Debug.LogError("Failed to read template file: " + ex.Message);
              return "-- Failed to read template file";
          }
      }

      /// <summary>
      /// 获取当前选中的路径或回退到默认路径。
      /// </summary>
      /// <returns>路径字符串</returns>
      private static string GetSelectedPathOrFallback()
      {
          string path = AssetDatabase.GetAssetPath(Selection.activeObject);
          if (!string.IsNullOrEmpty(path) && File.Exists(path))
          {
              return Path.GetDirectoryName(path) + "/";
          }
          return "Assets/";
      }
  }
  ```
</details>

3.3 在CreateLuaScript目录下创建LuaTemplates目录,在这个创建的目录下创建AdvancedTemplate.lua.txt,BasicTemplate.lua.txt,DefaultTemplate.lua.txt三个文件。如下图所示:

3.4 在三个Template下各自print自身

3.5 测试,鼠标右键之后,如下图所示:

3.6 点击Lua Scripts

3.7 重命名并选择lua脚本模板

3.8 点击Create,点击ok,lua脚本根据自定义的模板创建成功

标签:string,lua,private,Lua,Unity,txt,模板
From: https://www.cnblogs.com/nieya/p/18005299

相关文章

  • lua 语法介绍与 NGINX lua 高级用法实战操作
    目录一、概述二、lua安装三、lua语法1)lua数据类型2)lua变量3)lua拼接字符串4)lua循环5)lua函数6)lua条件控制7)lua库模块四、NGINXlua高级用法一、概述lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活......
  • hdu 1312 Red and Black (BFS模板题)
    Problem-1312(hdu.edu.cn)BFS模板题#include<iostream>#include<queue>usingnamespacestd;typedeflonglongll;constintINF=0x3f3f3f3f;intwx,hy,num;charroom[25][25];#defineCHECK(x,y)(x>=0&&x<wx&&y>=0&&am......
  • Windows Server 2022 OVF, updated Jan 2024 (sysin) - VMware 虚拟机模板
    WindowsServer2022OVF,updatedJan2024(sysin)-VMware虚拟机模板2024年1月版本更新,现在自动运行sysprep,支持ESXiHostClient部署请访问原文链接:https://sysin.org/blog/windows-server-2022-ovf/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org现在......
  • 基础算法(十)差分模板---以题为例
    输入一个长度为 n的整数序列。接下来输入 m个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r]之间的每个数加上 c。请你输出进行完所有操作后的序列。输入格式第一行包含两个整数 n 和 m。第二行包含 n 个整数,表示整数序列。接下来 m 行,每行包含三个整数 l,r......
  • 基础算法(九)二维前缀和模板---以题为例
    输入一个 n 行 m的整数矩阵,再输入q 个询问,每个询问包含四个整数 x1,y1,x2,y2,表示一个子矩阵的左上角坐标和右下角坐标。对于每个询问输出子矩阵中所有数的和。输入格式第一行包含三个整数 n,m,q。接下来 n行,每行包含m 个整数,表示整数矩阵。接下来 q 行,每行包含四个......
  • 基础算法(八)前缀和模板---以前缀和题目为例
    题目如下输入一个长度为 n的整数序列。接下来再输入 m个询问,每个询问输入一对 l,r。对于每个询问,输出原序列中从第 l 个数到第 r个数的和。输入格式第一行包含两个整数 n 和 m。第二行包含 n 个整数,表示整数数列。接下来 m 行,每行包含两个整数 l 和 r,......
  • 基础模板/算法
    线性筛求素数#include<bits/stdc++.h>usingnamespacestd;constintN=5e7+50;intn,tot,prime[N];//prime存储所有素数boolflag[N];//判断是否为素数intmain(){scanf("%d",&n);//初始化,flag全部置为truefor(inti=1;i<=n;i++)fl......
  • 【模板】AC 自动机
    和“阿狸的打字机”那道题很类似,也是把询问全部放到树上,拓扑排序一遍求解点击查看代码#include<bits/stdc++.h>usingnamespacestd;strings;intt[200005][26],tot,fail[200005],ans[200005],cnt[200005],d[200005];vector<int>g[200005];queue<int>q;intread1(){......
  • 基础算法(七)高精度除法模板
    模板如下#include<iostream>#include<vector>#include<algorithm>usingnamespacestd;vector<int>div(vector<int>&A,intB,int&r){vector<int>C;for(inti=0;i<A.size();i++){r=r*10+A[i];......
  • 基础算法(六)高精度乘法模板
    模板如下#include<iostream>#include<vector>usingnamespacestd;vector<int>mul(vector<int>&A,intb){vector<int>C;intk=0;for(inti=0;i<A.size();i++){k+=A[i]*b;C.push_back(k%10);......