当前位置: 首页 > 编程笔记 >

unity学习教程之定制脚本模板示例代码

厍彭薄
2023-03-14
本文向大家介绍unity学习教程之定制脚本模板示例代码,包括了unity学习教程之定制脚本模板示例代码的使用技巧和注意事项,需要的朋友参考一下

1、unity的脚本模板

新版本unity中的C#脚本有三类,第一类是我们平时开发用的C# Script;第二类是Testing,用来做单元测试;第三类是Playables,用作TimeLine中管理时间线上每一帧的动画、声音等。我们点击创建脚本时,会自动生成unity内置的一套模板:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {

 // Use this for initialization
 void Start () {
  
 }
 
 // Update is called once per frame
 void Update () {
  
 }
}

如果我们开发时使用的框架有明显的一套基础模板, 那为项目框架定制一套模板会很有意义,这样可以为我们省去编写重复代码的时间。这里介绍两种方法。

2、修改默认脚本模板

打开unity安装目录,比如D:\unity2018\Editor\Data\Resources\ScriptTemplates,unity内置的模板脚本都在这里,那么可以直接修改这里的cs文件,比如我们将81-C# Script-NewBehaviourScript.cs.txt文件修改为如下,那下次创建C# Script时模板就会变成这样:

////////////////////////////////////////////////////////////////////
//       _ooOoo_        //
//       o8888888o        //
//       88" . "88        //
//       (| ^_^ |)        //
//       O\ = /O        //
//      ____/`---'\____       //
//     .' \\|  |// `.       //
//     / \\||| : |||// \      //
//     / _||||| -:- |||||- \      //
//     | | \\\ - /// | |      //
//     | \_| ''\---/'' | |      //
//     \ .-\__ `-` ___/-. /      //
//    ___`. .' /--.--\ `. . ___      //
//    ."" '< `.___\_<|>_/___.' >'"".     //
//   | | : `- \`.;`\ _ /`;.`/ - ` : | |     //
//   \ \ `-. \_ __\ /__ _/ .-` / /     //
//  ========`-.____`-.___\_____/___.-`____.-'========   //
//       `=---='        //
//  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  //
//   佛祖保佑  永不宕机  永无BUG     //
////////////////////////////////////////////////////////////////////



using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class #SCRIPTNAME# : MonoBehaviour {

 // Use this for initialization
 void Start () {
  #NOTRIM#
 }
 
 // Update is called once per frame
 void Update () {
  #NOTRIM#
 }
}

3、拓展脚本模板

上面讲的第一种方法直接修改了unity的默认配置,这并不适应于所有项目,这里第二种方法会更有效,可以针对不同的项目和框架创建合适的脚本模板。

首先,先创建一个文本文件MyTemplateScript.cs.txt作为脚本模板,并将其放入unity project的Editor文件夹下,模板代码为:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyNewBehaviourScript : MonoBase {

 //添加事件监听
 protected override void AddMsgListener()
 {

 }
 
 //处理消息
 protected override void HandleMsg(MsgBase msg)
 {
  switch (msg.id)
  {
   default:
    break;
  }
 }

}

我们使用时,需要在Project视图中右击->Create->C# FrameScript 创建脚本模板,因此首先要创建路径为Assets/Create/C# FrameScript的MenuItem,点击创建脚本后,需要修改脚本名字,因此需要在拓展编辑器脚本中继承EndNameEditAction来监听回调,最终实现输入脚本名字后自动创建相应的脚本模板。


代码如下,将这个脚本放入Editor文件夹中:

using UnityEditor;
using UnityEngine;
using System;
using System.IO;
using UnityEditor.ProjectWindowCallback;
using System.Text;
using System.Text.RegularExpressions;

public class CreateTemplateScript {

  //脚本模板路径
  private const string TemplateScriptPath = "Assets/Editor/MyTemplateScript.cs.txt";

  //菜单项
  [MenuItem("Assets/Create/C# FrameScript", false, 1)]
  static void CreateScript()
  {
    string path = "Assets";
    foreach (UnityEngine.Object item in Selection.GetFiltered(typeof(UnityEngine.Object),SelectionMode.Assets))
    {
      path = AssetDatabase.GetAssetPath(item);
      if (!string.IsNullOrEmpty(path) && File.Exists(path))
      {
        path = Path.GetDirectoryName(path);
        break;
      }
    }
    ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, ScriptableObject.CreateInstance<CreateScriptAsset>(),
    path + "/MyNewBehaviourScript.cs",
    null, TemplateScriptPath);

  }
  
}


class CreateScriptAsset : EndNameEditAction
{
  public override void Action(int instanceId, string newScriptPath, string templatePath)
  {
    UnityEngine.Object obj= CreateTemplateScriptAsset(newScriptPath, templatePath);
    ProjectWindowUtil.ShowCreatedAsset(obj);
  }

  public static UnityEngine.Object CreateTemplateScriptAsset(string newScriptPath, string templatePath)
  {
    string fullPath = Path.GetFullPath(newScriptPath);
    StreamReader streamReader = new StreamReader(templatePath);
    string text = streamReader.ReadToEnd();
    streamReader.Close();
    string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(newScriptPath);
    //替换模板的文件名
    text = Regex.Replace(text, "MyTemplateScript", fileNameWithoutExtension);
    bool encoderShouldEmitUTF8Identifier = true;
    bool throwOnInvalidBytes = false;
    UTF8Encoding encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier, throwOnInvalidBytes);
    bool append = false;
    StreamWriter streamWriter = new StreamWriter(fullPath, append, encoding);
    streamWriter.Write(text);
    streamWriter.Close();
    AssetDatabase.ImportAsset(newScriptPath);
    return AssetDatabase.LoadAssetAtPath(newScriptPath, typeof(UnityEngine.Object));
  }

}

然后,在project中,点击创建C# FrameScript,输入脚本名字,对应的脚本就已经创建好了


4、总结

上面介绍了两种方案,第一种适合玩玩,第二种方法显然逼格高一些,为不同的项目和框架定制一套脚本模板,可以让我们少写一些重复代码。按照上面介绍的方法,我们同样可以修改和拓展Testing、Playables的脚本模板,甚至shader,我们也可以定制模板。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对小牛知识库的支持。

 类似资料:
  • 本文向大家介绍Laravel学习教程之本地化模块,包括了Laravel学习教程之本地化模块的使用技巧和注意事项,需要的朋友参考一下 前言 本文主要给大家介绍了关于Laravel本地化模块的相关内容,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍吧。 本文是基于Laravel 5.4版本的本地化模块代码进行分析书写; 模块组成 下图展示了本地化模块各个文件的关系,并进行简要说明; Tran

  • 本文向大家介绍ES6学习教程之模板字符串详解,包括了ES6学习教程之模板字符串详解的使用技巧和注意事项,需要的朋友参考一下 模板字符串(template strings) ES6 中引进的一种新型的字符串字面量语法 - 模板字符串。书面上来解释,模板字符串是一种能在字符串文本中内嵌表示式的字符串字面量。简单来讲,就是增加了变量功能的字符串。 ES6为我们提供了模板字符串,语法使用反引号`。模板字符

  • 本文向大家介绍Python 学习教程之networkx,包括了Python 学习教程之networkx的使用技巧和注意事项,需要的朋友参考一下 networkx是Python的一个包,用于构建和操作复杂的图结构,提供分析图的算法。图是由顶点、边和可选的属性构成的数据结构,顶点表示数据,边是由两个顶点唯一确定的,表示两个顶点之间的关系。顶点和边也可以拥有更多的属性,以存储更多的信息。 对于netwo

  • 本文向大家介绍socket.io学习教程之基本应用(二),包括了socket.io学习教程之基本应用(二)的使用技巧和注意事项,需要的朋友参考一下 前言 Socket.IO支持及时、双向与基于事件的交流。它可以在每个平台、每个浏览器和每个设备上工作,可靠性和速度同样稳定。 实时分析:将数据推送到客户端,这些客户端会被表示为实时计数器,图表或日志客户。 实时通信和聊天:只需几行代码便可写成一个Soc

  • 本文向大家介绍socket.io学习教程之深入学习篇(三),包括了socket.io学习教程之深入学习篇(三)的使用技巧和注意事项,需要的朋友参考一下 前言 socket.io提供了基于事件的实时双向通讯,本文深入的介绍了socket.io,下面来看看详细的内容吧。 静态文件 socket.io默认情况下会通过socket.io-client包提供socket.io.min.js和socket.i

  • 本文向大家介绍Spring学习教程之AOP模块的概述,包括了Spring学习教程之AOP模块的概述的使用技巧和注意事项,需要的朋友参考一下 概述 spirng-aop模块是Spring框架中的核心模块,虽然Spring Ioc container并不依赖AOP,但AOP给Ioc的实现提供了一种强大而灵活的解决方案。 在Spring Framework中,AOP主要是用于两种目的: 提供一些 企业