Unity 使用快速教程

简介: Unity是微软在CodePlex上的一个开源项目,可用于依赖注入、控制反转,类似Spring,下面是使用示例: 1.先来定义几个接口、类 1 namespace UnityTest 2 { 3 public interface IRun 4 { 5 ...

Unity是微软在CodePlex上的一个开源项目,可用于依赖注入、控制反转,类似Spring,下面是使用示例:

1.先来定义几个接口、类

click to see original image

1 namespace UnityTest
2 {
3     public interface IRun
4     {
5         void Run();
6     }
7 }
View Code : IRun
1 namespace UnityTest
2 {
3     public class Pet
4     {
5         public string Name { set; get; }
6     }
7 }
View Code : Pet
 1 using System;
 2 
 3 namespace UnityTest
 4 {
 5     public class Cat : Pet, IRun
 6     {
 7         public void Run()
 8         {
 9             Console.WriteLine("A cat is runing...");
10         }
11     }
12 }
View Code : Cat
 1 using System;
 2 
 3 namespace UnityTest
 4 {
 5     public class Dog : Pet, IRun
 6     {
 7         public void Run()
 8         {
 9             Console.WriteLine("A dog is runing...");
10         }
11     }
12 }
View Code : Dog
 1 namespace UnityTest.Model
 2 {
 3     public class Person
 4     {
 5         IRun iRun;
 6 
 7         public Person(IRun iRun)
 8         {
 9             this.iRun = iRun;
10         }
11 
12         public void HiWeGo()
13         {
14             iRun.Run();
15         }
16     }
17 }
View Code :Person

 2、创建对象实例

 1 using System;
 2 using System.Web.Script.Serialization;
 3 using Microsoft.Practices.Unity;
 4 
 5 namespace UnityTest
 6 {
 7     class Program
 8     {       
 9         static void Main(string[] args)
10         {
11             var container = new UnityContainer();           
12             container.RegisterType<IRun, Dog>(); //注册类型,并将IRun映射到Dog
13             var dog1 = container.Resolve<IRun>(); //创建一个IRun实例,实际上就是Dog
14             (dog1 as Dog).Name = "buddy";
15             Console.WriteLine("a dog is born,his name is \"{0}\"", (dog1 as Dog).Name); //a dog is born,his name is "buddy"
16             Console.Read();
17         }
18     }   
19 }
View Code

 3、使用标识符

当IRun同时有多个实例类要注入时,如果没有标识来区别,创建出来的实例“类型”就没办法显示指定。

1             var container = new UnityContainer();
2             container.RegisterType<IRun, Dog>()
3                     .RegisterType<IRun, Cat>();
4             var run = container.Resolve<IRun>();//这里的run实例,是cat,还是dog ?
5             Console.Write(run.ToString());//UnityTest.Cat
View Code
1             var container = new UnityContainer();
2             container.RegisterType<IRun, Dog>("dogType")
3                     .RegisterType<IRun, Cat>("catType");
4             var run = container.Resolve<IRun>("dogType");//明确指示,我要一个dog
5             Console.Write(run.ToString());//UnityTest.Dog
View Code

 4、创建单例

 1             var container = new UnityContainer();
 2             container.RegisterType<IRun, Dog>("dogTypeSingle", new ContainerControlledLifetimeManager())//dogTypeSingle为单例模式
 3                     .RegisterType<IRun, Dog>("dogType");
 4 
 5             var dog1 = container.Resolve<IRun>("dogTypeSingle");
 6             var dog2 = container.Resolve<IRun>("dogTypeSingle");
 7 
 8             Console.WriteLine(object.ReferenceEquals(dog1, dog2));//True
 9             Console.WriteLine(dog1.GetHashCode() == dog2.GetHashCode());//True 说明dog1与dog2是同一个对象
10 
11             var dog3 = container.Resolve<IRun>("dogType");
12             var dog4 = container.Resolve<IRun>("dogType");
13             Console.WriteLine(object.ReferenceEquals(dog3, dog4));//False
14             Console.WriteLine(dog3.GetHashCode() == dog4.GetHashCode());//False 说明dog3与dog4是不同的对象
View Code :Singleton

 5、依赖注入

构造器自动注入

1             var container = new UnityContainer();
2             container.RegisterType<IRun, Dog>();
3             var personWithDog = container.Resolve<Person>();
4             personWithDog.HiWeGo();//A dog is runing...
View Code

 构造器也可以结合标识符显示注入

 1             var container = new UnityContainer();
 2             container.RegisterType<IRun, Dog>("dog")
 3                 .RegisterType<IRun, Cat>("cat")
 4                 .RegisterType<Person, Person>("PersonWithDog", new InjectionConstructor(container.Resolve<IRun>("dog")))
 5                 .RegisterType<Person, Person>("PersonWithCat", new InjectionConstructor(container.Resolve<IRun>("cat")));
 6 
 7             var personWithDog = container.Resolve<Person>("PersonWithDog");
 8             personWithDog.HiWeGo();//A dog is runing...
 9             var personWithCat = container.Resolve<Person>("PersonWithCat");
10             personWithCat.HiWeGo();//A cat is runing...
11             Console.Read();
View Code

 使用InjectionConstructor特性注入

为了演示[InjectionConstructor]特性,先改造一下Person类

 1 using System.Collections.Generic;
 2 using Microsoft.Practices.Unity;
 3 namespace UnityTest
 4 {
 5     public class Person
 6     {
 7         private List<IRun> pets;
 8 
 9         public Person()
10         {
11             pets = new List<IRun>();
12         }
13 
14         [InjectionConstructor]
15         public Person(IRun iRun):this()
16         {
17             pets.Add(iRun);
18         }
19        
20         public Person(IRun iRun1,IRun iRun2):this()
21         {
22             pets.Add(iRun1);
23             pets.Add(iRun2);
24         }
25 
26 
27         public void HiWeGo()
28         {
29             foreach (var pet in pets)
30             {
31                 pet.Run();
32             }
33         }
34     }
35 }
View Code

测试一下:

 1             var container = new UnityContainer();
 2 
 3             container.RegisterType<IRun, Dog>("dog") //注册一个带标识的dog类型
 4                 .RegisterType<IRun, Cat>("cat") //注册一个带标识的cat类型
 5                 .RegisterType<IRun, Dog>() //不指定标识,即默认IRun的实例为dog
 6                 .RegisterType<Person, Person>("PersonWithDogAndCat",
 7                     new InjectionConstructor(
 8                         container.Resolve<IRun>("dog"),
 9                         container.Resolve<IRun>("cat")
10                     )//显示将二个参数的构造方法注册到容器中
11                 );
12 
13 
14             var person = container.Resolve<Person>();//自动调用有InjectionConstructor标记的构造方法
15             person.HiWeGo();//A dog is runing...
16 
17 
18             Console.WriteLine("---------------");
19 
20             var personWithDogAndCat = container.Resolve<Person>("PersonWithDogAndCat");//显式调用在容器中注册过的构造方法
21             personWithDogAndCat.HiWeGo();
22             //A dog is runing...
23             //A cat is runing...
24 
25             Console.Read();
View Code

 未完待续...

目录
相关文章
|
JavaScript 前端开发 程序员
用Unity不会几个插件怎么能行?Unity各类插件及教程推荐
话说工欲善其事必先利其器,程序员总是有一些开发利器,而对于Unity3D开发程序员来说,插件就是非常好用的利器。 今天博主,就将比较好用的插件推荐给大家,希望一起学习品鉴。
|
XML 编解码 编译器
Unity跨平台UI解决方案:可能是最全的FairyGUI系列教程-第八天
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
1489 0
|
8月前
|
持续交付 图形学 开发者
【Unity实战系列】Unity的下载安装以及汉化教程
【Unity实战系列】Unity的下载安装以及汉化教程
212 0
|
8月前
|
数据可视化 C# 图形学
【unity造轮子】Unity ShaderGraph使用教程与各种特效案例
点关注不迷路,持续输出干货文章。 嗨,大家好,我是向宇。最近在玩ShaderGraph,决定把我自己实验的所有效果记录到这篇博客中,附带完整高清的连线动态图,希望对想要学习ShaderGraph的同学有所启发。后续有发现一些新的ShaderGraph我还会继续进行更新。
|
存储 负载均衡 安全
【Unity干货教程】如何实现Unity和Android原生互相调用?
Unity是一个跨平台开发工具,发布到移动平台也是大部分Unity开发者的必备技能。而由于Unity跨平台的特性,总会遇到在移动平台的技术细节支持不够,或者需要在调用其他原生插件的情况。这里我们说一下如何在Android Studio中创建一个可供Unity调用的aar插件,以实现Unity和Android原生互相调用的目的。
|
图形学 Windows
很好用的Unity编辑器扩展工具 Odin Inspector教程
Odin包含许多功能,例如Static Inspector,Project Validation,Odin Editor Windows和我们的开源Odin Serializer,它允许您在需要多态对象结构时扩展Unity的序列化功能,或者希望在运行时序列化和反序列化数据。
很好用的Unity编辑器扩展工具 Odin Inspector教程
|
图形学
Unity3D教程:回合制游戏实现
一、场景布置 首先是简单的场景布置,在3D部分很简单。就几个简单的基本组件,在一个Plane上面放2个Cube,并且上不同颜色的纯色Material。唯一需要大家注意的是,请将两个Cube改好名,以免到时候编程不知道哪个跟哪个。
1636 0
|
API 图形学 Android开发
Unity跨平台UI解决方案:可能是最全的FairyGUI系列教程-第七天
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
917 0
|
前端开发 图形学 Android开发
Unity跨平台UI解决方案:可能是最全的FairyGUI系列教程-第六天
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
1487 0
|
XML 前端开发 图形学
Unity跨平台UI解决方案:可能是最全的FairyGUI系列教程-第五天
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
391 0