找回密码
 立即注册
查看: 176|回复: 0

超详细的Unity简介与使用方式,一看就懂的那种!

[复制链接]
发表于 2024-7-15 17:49 | 显示全部楼层 |阅读模式
前言

Unity引擎作为游戏开发东西之一,其受欢迎程度就不多说了,对于开发者而言,需要做的就是掌握unity的各项功能使用,帮抄本身做游戏开发。为此,才有了本篇给大师简单介绍的unity引擎与其使用。
<hr/>一、IOC介绍

IOC(Inversion of Control),中文译为控制反转,又称为“依赖注入”(DI =Dependence Injection)
IOC的基本概念是:不创建对象,但是描述创建它们的方式。
在代码中不直接与对象和处事连接,但在配置文件中描述哪一个组件需要哪一项处事。容器负责将这些联系在一起。
其道理是基于OO设计原则的The Hollywood Principle:Don&#39;t call us, we&#39;ll call you(别找我,我会来找你的)。
也就是说,所有的组件都是被动的(Passive),所有的组件初始化和调用都由容器负责。组件处在一个容器傍边,由容器负责打点。
简单地说,就是应用本身不负责依赖对象的创建和维护,而是将其交给一个外部容器来负责。这样控制权就由应用转移到了外部IoC 容器,即控制权实现了所谓的反转。
比如在类型A 中需要使用类型B 的实例,而B 实例的创建并不由A 来负责,而是通过外部容器来创建。通过IoC 的方式实现针对方针Controller 的激活具有重要的意义。
二、获取Unity

目前风行的IoC 框架,如AutoFac、Castle Windsor、Unity、http://Spring.NET、StructureMap和Ninject 等。
可以直接在Nuget中获取到最新版本的Unity。我用的是Unity,不是Unity for mvc。
三、介绍Unity####

Unit是微软patterns& practices组用C#实现的轻量级、可扩展的依赖注入容器,我们可以通过代码或者XML配置文件的形式来配置对象与对象之间的关系,
在运行时直接调用Unity容器即可获取我们所需的对象,以便成立松散耦合的应用法式。
对于小型项目:用代码的方式实现即可
对于中大型项目:使用配置文件斗劲好
Unity既然是一中Ioc框架,那么他同样满足Ioc的共性,依赖注入划分为3 种形式,即构造器注入、属性(设置)注入和接口注入。
四、Unity API(部门)

UnityContainer.RegisterType<ITFrom,TTO>();
UnityContainer.RegisterType< ITFrom, TTO>(”keyName”);
IEnumerable<T> databases = UnityContainer.ResolveAll<T>();
IT instance = UnityContainer.Resolve<IT>();
T instance = UnityContainer.Resolve<T>(”keyName”);
UnitContainer.RegisterInstance<T>(”keyName”,new T());
UnityContainer.BuildUp(existingInstance);
IUnityContainer childContainer1 = parentContainer.CreateChildContainer();
五、使用Untiy

如果是使用的NuGut安装的Unity库,那么在项目中将会自动添加引用
Microsoft.Practices.Unity.dll
Microsoft.Practices.Unity.Configuration.dll
Microsoft.Practices.Unity.RegistrationByConvention.dll
1、用编程方式实现注入

使用Unity来打点对象与对象之间的关系可以分为以下几步:
A、创建一个UnityContainer对象
B、通过UnityContainer对象的RegisterType方式来注册对象与对象之间的关系
C、通过UnityContainer对象的Resolve方式来获取指定对象关联的对象
注入代码如下:
  1. /// <summary>
  2.     /// 商品
  3.     /// </summary>
  4.     public interface IProduct
  5.     {
  6.         string ClassName { get; set; }
  7.         string ShowInfo();
  8.     }
  9.     /// <summary>
  10.     /// 牛奶
  11.     /// </summary>
  12.     public class Milk : IProduct
  13.     {
  14.         public string ClassName { get; set; }
  15.         public void ShowInfo()
  16.         {
  17.             return string.Format(”牛奶:{0}”, ClassName);
  18.         }
  19.     }
  20.     /// <summary>
  21.     /// 糖
  22.     /// </summary>
  23.     public class Sugar : IProduct
  24.     {
  25.         public string ClassName { get; set; }
  26.         public void ShowInfo()
  27.         {
  28.             return string.Format(”糖:{0}”, ClassName);
  29.         }
  30.     }
  31. /// <summary>
  32.         /// 代码注入
  33.         /// </summary>
  34.         public string ContainerCode()
  35.         {
  36.             IUnityContainer container = new UnityContainer();
  37.             container.RegisterType<IProduct, Milk>();  //默认注册(无定名),如果后面还有默认注册会覆盖前面的
  38.             container.RegisterType<IProduct, Sugar>(”Sugar”);  //定名注册
  39.             IProduct _product = container.Resolve<IProduct>();  //解析默认对象
  40.             _product.ClassName = _product.GetType().ToString();
  41.             string str1 = _product.ShowInfo();<br>
  42.             IProduct _sugar = container.Resolve<IProduct>(”Sugar”);  //指定定名解析对象
  43.             _sugar.ClassName = _sugar.GetType().ToString();
  44.             string str2 = _sugar.ShowInfo();<br><br>       StringBuilder strs = new StringBuilder();<br>       strs.Append(str1);<br>       strs.Append(str2);<br>
  45.             IEnumerable<IProduct> classList = container.ResolveAll<IProduct>(); //获取容器中所有IProduct的注册的已定名对象
  46.             foreach (var item in classList)
  47.             {
  48.                 item.ClassName = item.GetType().ToString();
  49.                 strs.Append(item.ShowInfo());
  50.             }return strs.ToString();
  51.         }</pre>
  52. 成果:
  53. 牛奶:UnityTest.Milk
  54. 糖:UnityTest.Sugar
  55. 糖:UnityTest.Sugar
复制代码
2、配置文件方式
通过配置文件配置Unity信息需要有以下几个法式:
A、在配置文件<configSections> 配置节下注册名为unity的section
B、在<configuration> 配置节下添加Unity配置信息
C、在代码中读取配置信息,并将配置载入到UnityContainer中
配置文件内容如下:
  1. <configSections>
  2.     <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  3.     <section name=”entityFramework” type=”System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089” requirePermission=”false” />
  4.     <!--声明容器-->
  5.     <section name=”unity” type=”Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration”/>
  6.   </configSections>
  7.   <unity>
  8.     <!--定义类型别号-->
  9.     <aliases>
  10.       <add alias=”IProduct” type=”UnityTest.IProduct,UnityTest” />
  11.       <add alias=”Milk” type=”UnityTest.Milk,UnityTest” />
  12.       <add alias=”Sugar” type=”UnityTest.Sugar,UnityTest” />
  13.     </aliases>
  14.     <!--容器-->
  15.     <container name=”MyContainer”>
  16.       <!--映射关系-->
  17.       <register type=”IProduct”  mapTo=”Milk”></register>
  18.       <register type=”IProduct”  mapTo=”Sugar” name=”Sugar”></register>
  19.     </container>
  20.   </unity></pre>
  21. 添加引用:
  22. using System.Configuration;
  23. using Microsoft.Practices.Unity.Configuration;
  24. <pre class=”code” data-lang=”javascript” style=”box-sizing: border-box; margin: 0px; padding: 0px; white-space: pre-wrap;”>/// <summary>
  25.         /// 配置文件注入
  26.         /// </summary>
  27.         public string ContainerConfiguration()
  28.         {
  29.             //加载容器配置
  30.             IUnityContainer container = new UnityContainer();
  31.             container.LoadConfiguration(”MyContainer”);
  32.             UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection(”unity”);//获取指定名称的配置节  
  33.             section.Configure(container, ”MyContainer”);//获取特定配置节下已定名的配置节<container name=&#39;MyContainer&#39;>下的配置信息
  34.             IProduct classInfo = container.Resolve<IProduct>(”Sugar”);
  35.             classInfo.ClassName = classInfo.GetType().ToString();
  36.             return classInfo.ShowInfo();
  37.         }</pre>
  38. 成果:
  39. 糖:UnityTest.Sugar
复制代码
如果系统斗劲复杂,那么对象之间的依赖关系可能就会很复杂,最终导致配置文件变得很大,所以我们需要将Unity的配置信息从App.config或web.config中分手出来到某一个单独的配置文件中,比如Unity.config,实现方式可以参考如下代码:
  1. <?xml version=”1.0” encoding=”utf-8”?>
  2. <configuration>
  3.   <system.web>
  4.     <compilation debug=”true” targetFramework=”4.5.2” />
  5.     <httpRuntime targetFramework=”4.5.2” />
  6.   </system.web>
  7.   <configSections>
  8.     <!--声明容器-->
  9.     <section name=”unity” type=”Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration”/>
  10.   </configSections>
  11.   <unity>
  12.     <!--定义类型别号-->
  13.     <aliases>
  14.       <add alias=”IProduct” type=”UnityTest.IProduct,UnityTest” />
  15.       <add alias=”Milk” type=”UnityTest.Milk,UnityTest” />
  16.       <add alias=”Sugar” type=”UnityTest.Sugar,UnityTest” />
  17.     </aliases>
  18.     <!--容器-->
  19.     <container name=”MyContainer”>
  20.       <!--映射关系-->
  21.       <register type=”IProduct”  mapTo=”Milk”></register>
  22.       <register type=”IProduct”  mapTo=”Sugar” name=”Sugar”></register>
  23.     </container>
  24.   </unity>
  25. </configuration></pre>
复制代码
注册代码:
  1. /// <summary>
  2.         /// 配置文件注入
  3.         /// </summary>
  4.         public string ContainerConfiguration2()
  5.         {
  6.             IUnityContainer container = new UnityContainer();
  7.             string configFile = ”Unity.config”;
  8.             var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = configFile };
  9.             //从config文件中读取配置信息
  10.             Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
  11.             //获取指定名称的配置节
  12.             UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection(”unity”);
  13.             //载入名称为FirstClass 的container节点
  14.             container.LoadConfiguration(section, ”MyContainer”);
  15.             IProduct classInfo = container.Resolve<IProduct>(”Sugar”);
  16.             classInfo.ClassName = classInfo.GetType().ToString();
  17.             return classInfo.ShowInfo();
  18.         }</pre>
  19. 成果:
  20. 糖:UnityTest.Sugar
复制代码
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-21 21:03 , Processed in 0.099489 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表