技术笔记:Unity(一)介绍与基本使用

简介: 技术笔记:Unity(一)介绍与基本使用

一、IOC介绍


IOC(Inversion of Control),中文译为控制反转,又称为“依赖注入”(DI =Dependence Injection)


IOC的基本概念是:不创建对象,但是描述创建它们的方式。


在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器负责将这些联系在一起。


其原理是基于OO设计原则的The Hollywood Principle:Don't call us, we'll call you(别找我,我会来找你的)。


也就是说,所有的组件都是被动的(Passive),所有的组件初始化和调用都由容器负责。组件处在一个容器当中,由容器负责管理。


简单地说,就是应用本身不负责依赖对象的创建和维护,而是将其交给一个外部容器来负责。这样控制权就由应用转移到了外部IoC 容器,即控制权实现了所谓的反转。


比如在类型A 中需要使用类型B 的实例,而B 实例的创建并不由A 来负责,而是通过外部容器来创建。通过IoC 的方式实现针对目标Controller 的激活具有重要的意义。


二、获取Unity


目前流行的IoC 框架,如AutoFac、Castle Windsor、Unity、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();


UnityContainer.RegisterType("keyName");


IEnumerable databases = UnityContainer.ResolveAll();


IT instance = UnityContainer.Resolve();


T instance = UnityContainer.Resolve("keyName");


UnitContainer.RegisterInstance("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方法来获取指定对象关联的对象


public class UnitTest


{


///


/// 商品


///


public interface IProduct


{


string ClassName { get; set; }


string ShowInfo();


}


///


/// 牛奶


///


public class Milk : IProduct


{


public string ClassName { get; set; }


public void ShowInfo()


{


return string.Format("牛奶:{0}", ClassName);


}


}


///


/// 糖


///


public class Sugar : IProduct


{


public string ClassName { get; set; }


public void ShowInfo()


{


return string.Format("糖:{0}", ClassName);


}


}


///


/// 代码注入


///


public string ContainerCode()


{


IUnityContainer container = new UnityContainer();


container.RegisterType(); //默认注册(无命名),如果后面还有默认注册会覆盖前面的


container.RegisterType("Sugar"); //命名注册


IProduct _product = container.Resolve(); //解析默认对象


_product.ClassName = _product.GetType().ToString();


string str1 = _product.ShowInfo();


IProduct _sugar = container.Resolve("Sugar"); //指定命名解析对象


_sugar.ClassName = _sugar.GetType().ToString();


string str2 = _sugar.ShowInfo();


       StringBuilder strs = new StringBuilder();


       strs.Append(str1);


       strs.Append(str2);


IEnumerable classList = container.ResolveAll(); //获取容器中所有IProduct的注册的已命名对象


foreach (var item in classList)


{


item.ClassName = item.GetType().ToString();


strs.Append(item.ShowInfo());


}return strs.ToString();


}


}


结果:牛奶:UnityTest.Milk 糖:UnityTest.Sugar 糖:UnityTest.Sugar


2、配置文件方式


通过配置文件配置Unity信息需要有以下几个步骤:


A、在配置文件 配置节下注册名为unity的section


B、在 配置节下添加Unity配置信息


C、在代码中读取配置信息,并将配置载入到UnityContainer中


配置文件内容如下:


1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18

19


20

21

22


23


添加引用:


using System.Configuration;


using Microsoft.Practices.Unity.Configuration;


///


/// 配置文件注入


///


public string ContainerConfiguration()


{


//加载容器配置


IUnityContainer container = new UnityContainer();


container.LoadConfiguration("MyContainer");


UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");//获取指定名称的配置节


section.Configure(container, "MyContainer");//获取特定配置节下已命名的配置节下的配置信息


IProduct classInfo = container.Resolve("Sugar");


classInfo.ClassName = classInfo.GetType().ToString();


return classInfo.ShowInfo();


}


结果:糖:UnityTest.Sugar


如果系统比较庞大,那么对象之间的依赖关系可能就会很复杂,最终导致配置文件变得很大,所以我们需要将Unity的配置信息从App.config或web.config中分离出来到某一个单独的配置文件中,比如Unity.config,实现方式可以参考如下代码:


<?xml version="1.0" encoding="utf-8"?>








注册代码:


///


/// 配置文件注入


///


public string ContainerConfiguration2()


{


IUnityContainer container = new UnityContainer();


string configFile = "Unity.config";


var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = configFile };


//从config文件中读取配置信息


Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);


//获取指定名称的配置节


UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("//代码效果参考:http://www.jhylw.com.cn/303233961.html

unity");

//载入名称为FirstClass 的container节点


container.LoadConfiguration(section, "MyContainer");


IProduct classInfo = container.Resolve("Sugar");


classInfo.ClassName = classInfo.GetType().ToString();


return classInfo.ShowInfo();


}


来源:


参考:

相关文章
|
3月前
|
图形学 机器学习/深度学习 人工智能
颠覆传统游戏开发,解锁未来娱乐新纪元:深度解析如何运用Unity引擎结合机器学习技术,打造具备自我进化能力的智能游戏角色,彻底改变你的游戏体验——从基础设置到高级应用全面指南
【8月更文挑战第31天】本文探讨了如何在Unity中利用机器学习增强游戏智能。作为领先的游戏开发引擎,Unity通过ML-Agents Toolkit等工具支持AI代理的强化学习训练,使游戏角色能自主学习完成任务。文章提供了一个迷宫游戏示例及其C#脚本,展示了环境观察、动作响应及奖励机制的设计,并介绍了如何设置训练流程。此外,还提到了Unity与其他机器学习框架(如TensorFlow和PyTorch)的集成,以实现更复杂的游戏玩法。通过这些技术,游戏的智能化程度得以显著提升,为玩家带来更丰富的体验。
64 1
|
3月前
|
开发者 图形学 Java
揭秘Unity物理引擎核心技术:从刚体动力学到关节连接,全方位教你如何在虚拟世界中重现真实物理现象——含实战代码示例与详细解析
【8月更文挑战第31天】Unity物理引擎对于游戏开发至关重要,它能够模拟真实的物理效果,如刚体运动、碰撞检测及关节连接等。通过Rigidbody和Collider组件,开发者可以轻松实现物体间的互动与碰撞。本文通过具体代码示例介绍了如何使用Unity物理引擎实现物体运动、施加力、使用关节连接以及模拟弹簧效果等功能,帮助开发者提升游戏的真实感与沉浸感。
78 1
|
3月前
|
安全 Linux 图形学
Linux平台Unity下RTMP|RTSP低延迟播放器技术实现
本文介绍了在国产操作系统及Linux平台上,利用Unity实现RTMP/RTSP直播播放的方法。通过设置原生播放模块的回调函数,可将解码后的YUV数据传递给Unity进行渲染,实现低延迟播放。此外,还提供了播放器启动、参数配置及停止的相关代码示例,并概述了如何在Unity中更新纹理以显示视频帧。随着国产操作系统的发展,此类跨平台直播解决方案的需求日益增长,为开发者提供了灵活高效的开发方式。
|
3月前
|
开发者 图形学 API
从零起步,深度揭秘:运用Unity引擎及网络编程技术,一步步搭建属于你的实时多人在线对战游戏平台——详尽指南与实战代码解析,带你轻松掌握网络化游戏开发的核心要领与最佳实践路径
【8月更文挑战第31天】构建实时多人对战平台是技术与创意的结合。本文使用成熟的Unity游戏开发引擎,从零开始指导读者搭建简单的实时对战平台。内容涵盖网络架构设计、Unity网络API应用及客户端与服务器通信。首先,创建新项目并选择适合多人游戏的模板,使用推荐的网络传输层。接着,定义基本玩法,如2D多人射击游戏,创建角色预制件并添加Rigidbody2D组件。然后,引入网络身份组件以同步对象状态。通过示例代码展示玩家控制逻辑,包括移动和发射子弹功能。最后,设置服务器端逻辑,处理客户端连接和断开。本文帮助读者掌握构建Unity多人对战平台的核心知识,为进一步开发打下基础。
120 0
|
3月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
77 0
|
5月前
|
分布式计算 图形学 Spark
技术笔记:Unity洛克人移动部分源码
技术笔记:Unity洛克人移动部分源码
32 0
|
3月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
172 6
|
2月前
|
测试技术 C# 图形学
掌握Unity调试与测试的终极指南:从内置调试工具到自动化测试框架,全方位保障游戏品质不踩坑,打造流畅游戏体验的必备技能大揭秘!
【9月更文挑战第1天】在开发游戏时,Unity 引擎让创意变为现实。但软件开发中难免遇到 Bug,若不解决,将严重影响用户体验。调试与测试成为确保游戏质量的最后一道防线。本文介绍如何利用 Unity 的调试工具高效排查问题,并通过 Profiler 分析性能瓶颈。此外,Unity Test Framework 支持自动化测试,提高开发效率。结合单元测试与集成测试,确保游戏逻辑正确无误。对于在线游戏,还需进行压力测试以验证服务器稳定性。总之,调试与测试贯穿游戏开发全流程,确保最终作品既好玩又稳定。
98 4
|
3月前
|
图形学 缓存 算法
掌握这五大绝招,让您的Unity游戏瞬间加载完毕,从此告别漫长等待,大幅提升玩家首次体验的满意度与留存率!
【8月更文挑战第31天】游戏的加载时间是影响玩家初次体验的关键因素,特别是在移动设备上。本文介绍了几种常见的Unity游戏加载优化方法,包括资源的预加载与异步加载、使用AssetBundles管理动态资源、纹理和模型优化、合理利用缓存系统以及脚本优化。通过具体示例代码展示了如何实现异步加载场景,并提出了针对不同资源的优化策略。综合运用这些技术可以显著缩短加载时间,提升玩家满意度。
136 5
|
2月前
|
前端开发 图形学 开发者
【独家揭秘】那些让你的游戏瞬间鲜活起来的Unity UI动画技巧:从零开始打造动态按钮,提升玩家交互体验的绝招大公开!
【9月更文挑战第1天】在游戏开发领域,Unity 是最受欢迎的游戏引擎之一,其强大的跨平台发布能力和丰富的功能集让开发者能够迅速打造出高质量的游戏。优秀的 UI 设计对于游戏至关重要,尤其是在手游市场,出色的 UI 能给玩家留下深刻的第一印象。Unity 的 UGUI 系统提供了一整套解决方案,包括 Canvas、Image 和 Button 等组件,支持添加各种动画效果。
132 3