Unity3d开发设计(十八)监视编写器情况更改 制订

摘要:文中源于 阿修罗道,严禁用以商业服务主要用途,转截请标明出處。全文连接:fansongy/article/details/ 做编写器软件时,我一直要想取得监视编写器的情况转变。例如在开启编写器...

文中源于 阿修罗道,严禁用以商业服务主要用途,转截请标明出處。

全文连接:fansongy/article/details/

 

 

 

 

 

 

 

 

 


 

 

做编写器软件时,我一直要想取得监视编写器的情况转变。例如在开启编写器刚开始运作自身的服务。这时候就必须客户开启编写器的恶性事件。再例如希望游戏中撤出运作方式以前,把一些编写的物品缓存文件出去,随后对这种数据信息做全自动化解决,那麼我也必须撤出运作方式的恶性事件。例如该类吧。

另外一层面,希望用观查者方式,而且能全自动化申请注册。由于我留意到,导进資源时的AssetImporter回调函数便是那样做的。客户只必须完成一个插口,便可以接到回调函数。巨大的简单化了拓展步骤。编写器编码又无须考虑到高效率难题,依靠C#的反射面,能够非常容易的完成这类作用。

全套架构的起动关键是特性InitializeOnLoad。当Unity3d运作或起动时,会再次载入有脚本制作。当应用这一宏时,编写器会全自动将被标明的类案例化到运行内存中。因而大家能够运用这一特点,在它的结构涵数中拉起大家全部服务。 这儿有一个小窍门。在起动Unity编写器的状况下,假如在结构涵数中建立目标,会被别的消除涵数弄死。我觉得是脚本制作原始化次序,或者情景转换造成的,实际缘故得问Unity了。以便处理这一难题,我依靠了update涵数,跳了一帧实行需有的逻辑性。

全自动申请注册是依靠C#的反射面,根据GetAssemblies和GetTypes获得到全部的类,随后建立出相匹配的案例。

这一类我认为有一个非常合适的姓名 NightWatch。假如你没看了冰与火之歌,将会了解这一架构算是有点儿难度系数。总的来说,这一架构叙述了一个青少年添加守夜人团队,并去万里长城以外作战的小故事...

插口类以下:

public interface ICrow
 /// summary 
 /// Join the Nights Watch 
 /// /summary 
 void Enroll();
 /// summary 
 /// Before to Enter Wild
 /// /summary 
 void PrepareForBattle();
 /// summary 
 /// To the Weirwood outside the wall
 /// /summary 
 void FaceWeirwood();
 /// summary 
 /// Back To the Castle Black
 /// /summary 
 void OpenTheGate();
 /// summary 
 /// Tell Vow to the Old God
 /// /summary 
 void Vow();
}

案例类以下:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
[InitializeOnLoad]
public class NightsWatch
 #region Public Attributes
 #endregion
 #region Private Attributes
 private static List ICrow m_crows = new List ICrow 
 #endregion
 #region Public Methods
 static NightsWatch()
 if (!EditorApplication.isPlayingOrWillChangePlaymode)
 EditorApplication.update += WelcomeToCastleBlack;
 else 
 EditorApplication.update += BeyondTheWall;
 static eToCastleBlack()
 EditorApplication.update -= WelcomeToCastleBlack;
 //Debug.Log( Welcome To castle black 
 m_crows.Clear();
 var crows = GetAllImplementTypes ICrow (System.AppDomain.CurrentDomain);
 foreach (var eachCrow in crows)
 eachCrow.Enroll();
 m_crows.Add(eachCrow);
 EditorApplication.update += WaitForWild;
 static void WaitForWild()
 if (EditorApplication.isPlayingOrWillChangePlaymode)
 foreach (var eachCrow in m_crows)
 eachCrow.PrepareForBattle();
 EditorApplication.update -= WaitForWild;
 static void BeyondTheWall()
 EditorApplication.update -= BeyondTheWall;
 //Debug.Log( Welcome To The Wild 
 m_crows.Clear();
 var crows = GetAllImplementTypes ICrow (System.AppDomain.CurrentDomain);
 foreach (var eachCrow in crows)
 eachCrow.FaceWeirwood();
 m_crows.Add(eachCrow);
 EditorApplication.update += WaitForCrowReturn;
 static void WaitForCrowReturn()
 if (!EditorApplication.isPlayingOrWillChangePlaymode )
 //Debug.Log( Open the Door 
 EditorApplication.update -= WaitForCrowReturn;
 foreach (var eachCrow in m_crows)
 eachCrow.OpenTheGate();
 EditorApplication.update += WelcomeToCastleBlack;
 public static void CrowsVow()
 foreach (var eachCrow in m_crows)
 eachCrow.Vow();
 [MenuItem( Land/CastleBlack )]
 public static void MakeVow()
 NightsWatch.CrowsVow();
 #endregion
 #region Override Methods
 #endregion
 #region Private Methods
 public static T[] GetAllImplementTypes T (System.AppDomain aAppDomain) where T : class
 var result = new List T 
 var assemblies = aAppDomain.GetAssemblies();
 foreach (var assembly in assemblies)
 var types = assembly.GetTypes();
 foreach (var type in types)
 if (typeof(T).IsAssignableFrom(type))
 if (!type.IsAbstract)
 var tar = assembly.CreateInstance(type.FullName) as T;
 result.Add(tar);
 return result.ToArray();
 #endregion

简易表述一下,全部的插口全是依照冰与火之歌中的剧情界定。当在编写情况下时,会建立相匹配的案例类,并启用Enroll涵数,这非常于Jon不久进到CastleBlack。当点一下Play运作时,会先启用PrepareForBattle,非常于在古城堡中提前准备出战。当手机游戏刚开始运作时,会启用FaceToWeirWood,这儿相匹配的是城边那颗鱼梁木,一般出战以前全是要去祷告一下。随后当手机游戏运作完毕时,会启用OpenTheGate,相匹配出战回家,在万里长城下边喊门。随后有一个Vow插口,这一是用于训话的,古城堡里的乌鸦必须列队答 道 。

在建2个案例: 一个是JonSnow:

public class JonSnow : ICrow
 public void Enroll()
 Debug.Log(this + join the NightWatch! 
 public void PrepareForBattle()
 Debug.Log(this + follow your lead! 
 public void FaceWeirwood()
 Debug.Log( I m the wolf in the north 
 public void OpenTheGate()
 Debug.Log(this + request enter Castle Black 
 public void Vow()
 Debug.Log(this + For The Watch 
}

一个是Samwell:

public class Samwell : ICrow
 public void Enroll()
 Debug.Log(this + I came form Lord Randyll Tarly,and I even his oldest son ... 
 public void PrepareForBattle()
 Debug.Log(this + is not ready yet... 
 public void FaceWeirwood()
 Debug.Log( I m a useless warrior,but may be ... helpful 
 public void OpenTheGate()
 Debug.Log(this + also want enter 
 public void Vow()
 Debug.Log(this + For The ... alive 
}

当写好编码编译程序进行时,就可以在輸出看出到他们到万里长城去报导了。点一下运作程序,关掉运作程序,会各自有系统日志輸出,实际效果以下:


在其中红杠是点一下Play实际操作,绿线是终止Unity运作的实际操作,红杠之上的系统日志是开启unity或再次编译程序时輸出的。一切依照预估完成,下班。

假如你感觉本文对给你协助,能够随手点个顶,不仅不容易喜当爹,还能让大量人可以看到它...
 



联系我们

全国服务热线:4000-399-000 公司邮箱:343111187@qq.com

  工作日 9:00-18:00

关注我们

官网公众号

官网公众号

Copyright?2020 广州凡科互联网科技股份有限公司 版权所有 粤ICP备10235580号 客服热线 18720358503

技术支持:网站建设系统