当前位置:   article > 正文

【编辑器】unity自动化生成UI模板代码_unity的炫酷ui工程源文件

unity的炫酷ui工程源文件

前言

在游戏制作用,UI的代码架构是固定的。为了快速开发,只需要获得一个完整的UI结构代码,然后编写对应的业务逻辑即可。所以,自动化生成模板代码是一件必不可少的事情。

环境

UI的架构通常使用MVC的结构,这次就演示V的生成,其他模板的生成流程其实也大同小异。代码就不加功能了,重点放到生成代码上面去。

思路

  1. 制作模板代码,设置标志位。
  2. 生成->得到组件,遍历模板,在标志位后添加组件处理。
    更新->标志位范围的代码不保存,重新生成组件代码。
  3. 根据指定生成路径,生成代码。

View

public class TempletView 
{
    public const string Name = "TempletView";   
      
    public GameObject m_GameObject = null;
    public Transform m_Transform = null; 
    
    public void OnInit(GameObject root)
     { 
     	m_GameObject = root;
     	m_Transform = m_GameObject.transform;
     	InitUI();
     }
}

private void InitUI()
{   
     //Start  
     //End 
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

创建代码

StringBuilder codeStringBuilder = new StringBuilder();

using(StreamReader reader  = File.OpenText(TempletViewPath)
{
      string lineReader = string.Empty;
      while ((lineReader = reader.ReadLine()) != null)
      {
      	 if(lineReader .Contains("TempletView ")
      	 {      
      		 lineReader = lineReader.replace("TempletView",prefabName);
      	 }
      		
	 codeStringBuilder. Append(lineReader);
		
	 if(lineReader.Contains("Transform m_Transform")
	 {
		 for(int index = 0;index<Components.count;index++)    
   		 {     
     		     codeStringBuilder.Append($"m_{Components[index].name}_{Components[index].getType().Name} =  null;\n");
          	 } 
           }
 
	 if(lineReader.Contains("Start")
	 {      
		 for(int index = 0;index<Components.count;index++)    
		 {     
	 	     codeStringBuilder.Append($"m_{Components[index].name}_{Components[index].getType().Name} =  m_Transform.Find("{Components[index].name}").gameobject.GetComponent<{Components[index].getType().Name}>();\n");
       		 }	
       	 } 
      }
}

if(codeStringBuilder.Length>0)
{  
      StreamWriter writter = File.CreateText(UIFilePath);  
      writter.Write(codeStringBuilder.toString()); 
      writter.Close();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

更新代码

StringBuilder codeStringBuilder = new StringBuilder();

using(StreamReader reader  = File.OpenText(UIFilePath)
{
      string lineReader = string.Empty;      
      bool replace =false;
      while ((lineReader = reader.ReadLine()) != null)
      {
	if(!replace)
	{  
	       codeStringBuilder. Append(lineReader);
	}
  	if(lineReader.Contains("Start") || lineReader.Contains("Transform m_Transform"))
	{      
	       replace  = true;
	}  

	if(lineReader.Contains("void OnInit"))
	{
	       replace = false;
	       for(int index = 0;index<Components.count;index++)    
      	       {     
            	      codeStringBuilder.Append($"m_{Components[index].name}_{Components[index].getType().Name} =  null;\n");
               }               
               codeStringBuilder.Append("\n\n");
               codeStringBuilder.Append(lineReader);
         }
  
	if(lineReader.Contains("End")
  	{      
  	       replace  = false;
  	       for(int index = 0;index<Components.count;index++)    
  	       {     
     		      codeStringBuilder.Append($"m_{Components[index].name}_{Components[index].getType().Name} =  m_Transform.Find("{Components[index].name}").gameobject.GetComponent<{Components[index].getType().Name}>();");
               } 
	      codeStringBuilder.Append(lineReader);
	}
     }
 }

if(codeStringBuilder.Length>0)
{ 
 	StreamWriter writter = File.CreateText(UIFilePath);
 	writter.Write(codeStringBuilder.toString());
 	writter.Close();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

注意点

  1. StreamWriter 打开了必须要关闭,否则该文件一直会处于使用状态。再运行就跑不了,只能重开UNITY。这也是为什么我放到最后统一搞,这样上面无论怎么崩溃都不会影响写入。
  2. File的使用要小心,看清楚是打开还是复写,否则异常中断时,文件内容可能就被清空了。。2.File的使用要小心,看清楚是打开还是复写,否则异常中断时,文件内容可能就被清空了。。
  3. 使用using命名空间,可以控制StreamReader的使用范围,免得被其他地方意外调用。
  4. 文档的更新需要依赖标志,如例子中的“Start‘和‘End’。这个标志需要是唯一的,而且不可被删除,否则就更新不了了。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/115314
推荐阅读
相关标签
  

闽ICP备14008679号