Unity3D

Unity3D中Prefab

Prefab概念:

Prefab是一种资源类型——存储在项目视图中的一种可反复使用的游戏对象。因而当游戏中须要非常多反复使用的对象、资源等时,Prefab就有了用武之地。它拥有下面特点:

  •   能够放到多个场景中。也能够在同一个场景中放置多次
  •   当加入一个Prefab到场景中,就创建了它的一个实例
  •   全部的Prefab实例链接到原始Prefab,本质上是原始Prefab的克隆。
  •   不论项目中存在多少实例。仅仅要对Prefab进行了改动。全部Prefab实例都将随之发生变化。

创建填充Prefab

为了创建一个Prefab。必须使用菜单构造一个新的空白Prefab。不包括游戏对象,因而不能创建它的一个实例。

此时这个新的Prefab像一个空的container,想要使用它。必须用游戏对象的数据来填充它,让它不空。创建方法为Project视图中Create->Prefab(或导航菜单条Assets->Create->Prefab),此时能够看到Project视图多了个灰色的小立方体,它就是创建的Prefab。

unity3D中Shader的分类和区别

Shader按管线分类一般分为固定渲染管线与可编程渲染管线

(1)固定渲染管线 ——这是标准的几何&光照(Transforming&Lighting)管线,功能是固定的,它控制着世界、视、投影变换及固定光照控 制和纹理混合。T&L管线可以被渲染状态控制,矩阵,光照和采制参数。功能比较有限。基本所有的显卡都能正常运行。

(2)可编程渲染管线——对渲染管线中的顶点运算和像素运算分别进行编程处理,而无须象固定渲染管线那样套用一些固定函数,取代设置参数来控制管线。

unity3d的三种Shader

(1)Fixed function shader 属于固定渲染管线 Shader, 基本用于高级Shader在老显卡无法显示时的Fallback(之后有详细介绍)。使用的是ShaderLab语言,语法与微软的FX files 或者NVIDIA的 CgFX类似。

(2)Vertex and Fragment Shader 最强大的Shader类型,属于可编程渲染管线. 使用的是CG/HLSL语法。

Unity架构常用的几种方式

对于初学者来说,视频《Unity项目架构设计与开发管理》(http://v.qq.com/boke/page/d/0/u/d016340mkcu.html),全是干货。简单的总结了一下,Unity的架构有如下几种常用的方式。

1、EmptyGO:

在Hierarchy上创建一个空的GameObject,然后挂上所有与GameObject无关的逻辑控制的脚本。使用GameObject.Find()访问对象数据。

缺点:逻辑代码散落在各处,不适合大型项目。

2、Simple GameManager:

所有与GameObject无关的逻辑都放在一个单例中。
缺点:单一文件过于庞大。

3、Manager Of Managers:

将不同的功能单独管理。如下:

• MainManager: 作为入口管理器。
• EventManager: 消息管理。
• GUIManager: 图形视图管理。
• AudioManager: 音效管理。
• PoolManager: GameObject管理(减少动态开辟内存消耗,减少GC)。

实现一个简单的PoolManager

Unity应用架构设计(13)——日志组件的实施

对于应用程序而言,日志是非常重要的功能,通过日志,我们可以跟踪应用程序的数据状态,记录Crash的日志可以帮助我们分析应用程序崩溃的原因,我们甚至可以通过日志来进行性能的监控。总之,日志的好处很多,特别是对Release之后的线上版本进行异常的跟踪。

日志存储的分类

在平常开发时,我们通常喜欢在Debug模式下进行调试,通过断点,可以跟踪数据的变化。除了调试,另一种直观的方式是使用控制台输出,比如Java的system.out.println(),.NET的Console.WriteLine(),Swift的print()等等。在Untiy中,为我们提供了Debug.Log()方式来记录。

而对于线上的版本,上述两种调试都不行,那我们怎么来跟踪数据呢?

从日志的存储分类上来看,可以分为四类:控制台,文件系统,数据库,第三方平台

• 控制台:本地开发时使用,记录数据和跟踪执行过程,方便直观

• 文件系统:可以是一些用户行为性的日志,这些文件可以被用来监控执行时间,进行性能的分析,如果用户同意,则将这些日志传到服务器上

• 数据库:记录了一些异常日志,也就是Catch了之后的行为,每次用户登录时,传到服务器,帮助分析原因

Unity应用架构设计(12)——AOP思想的实践

想象一下,当程序所有的业务逻辑都完成的时候,你可能还来不及喘口气,紧张的测试即将来临。你的Boss告诉你,虽然程序没问题,但某些方法为什么执行这么慢,性能堪忧。领会了Boss的意图之后,漫长的排查问题开始了。你会写日志,或者是其他工具来追踪原因。那么如何以一种优雅的形式,并且不侵入业务代码的形式来跟踪呢?这正是本文的内容。
上一篇:Unity应用架构设计(11)——一个网络层的构建

跟踪问题

通过观察,你发现方法Do执行缓慢,可能有性能问题,因为这是一个线上的版本,你无法进行Debug,所以你通过日志的形式来追踪执行步骤:

class Foo1
{
    void Do()
    {
        //日志记录开始
        //性能监控开始
        DoSomething();
        //日志记录结束
        //性能监控结束
    }
}

看起来不错,解决问题之后,测试又发现另一个方法Handle貌似也有问题,然后你一样画葫芦,虽然麻烦了一点,但总归是有解决方案:

Unity应用架构设计(11)——一个网络层的构建

对于客户端应用程序,免不了和远程服务打交道。设计一个良好的『服务层』能帮我们规范和分离业务代码,提高生产效率。服务层最核心的模块一定是怎样发送请求,虽然Mono提供了很多C#网络请求类,诸如WebClient,HttpWebRequest,但考虑到跨平台,这些类不一定适用。不过不用担心,Unity 5.x提供了新的与网络相关类UnityWebRequest用来替代原先的WWW,这是官方推荐的,也是最佳选择。

上一篇:Unity应用架构设计(10)——绕不开的协程和多线程

使用Token进行身份验证

首先我们必须要考虑的是,怎样和Web服务安全的通信。没错,肯定是身份验证(Authentication)。对于像WebClient这些类,它们会提供一个属性,比如Credentials,可以在此属性设置一些身份验证信息,比如用户名,密码,域。这是一个很『重』的解决方案,且不论是否能在Unity中实现,单从密码这个角度,很多游戏根本不需要密码。所以,我们需要一种『轻』量级的身份验证机制,这就是Token,中文翻译叫『令牌』。

Token有两个重要的特点:

Unity应用架构设计(10)——绕不开的协程和多线程(Part 1)

在进入本章主题之前,我们必须要了解客户端应用程序都是单线程模型,即只有一个主线程(Main Thread),或者叫做UI线程,即所有的UI控件的创建和操作都是在主线程上完成的。而服务器端应用程序,也就是我们常见的Web应用程序往往是多线程的,故用户A访问势必不会影响用户B的访问过程。所以对于Web应用而言,多线程的数据同步和并发的管理往往是个头疼的问题。那么对于客户端应用程序而言,就一个人使用,还要需要考虑多线程吗?

上一篇:Unity应用架构设计(9)——构建统一的 Repository

是否需要多线程?

这是个好问题,从设备的硬件上,这已不是瓶颈:

学过操作系统的同学肯定知道CPU是真正的处理大脑,在单核的CPU年代,在某一时刻CPU只能处理一个线程,通过CPU的调度来实现在不同线程间切换工作。由于CPU调度的时间很快,所以给人造成并发的假象。
随着硬件的提升,多核CPU已经是常态化了。比如双核CPU而言,某一时刻可以有2个线程并行计算。

所以,是否需要在客户端使用多线程技术,还是取决于你的应用的复杂度:

Unity应用架构设计(3)——构建View和ViewModel的生命周期

对于一个View而言,本质上是一个MonoBehaviour。它本身就具备生命周期这个概念,比如,Awake,Start,Update,OnDestory等。这些是非常好的方法,可以让开发者在各个阶段去执行自定义的代码。但唯一遗憾的事,这些方法是有引擎调用,并且颗粒度不够细。本文将谈谈怎样构建View和ViewModel的生命周期。

View的生命周期

举个栗子,一个View的显示会有如下过程:

• 初始化操作
• 激活当前对象,SetActive(true)
• 显示当前对象,包括localScale=Vector3.one,并且alpha从0->1
• 当View显示之后,执行某些callBack方法,OnCompleted或者OnSuccess

再举个栗子,一个View隐藏会有如下过程:

• 隐藏当前对象,包括localScale=Vector3.zero,并且alpha从1->0
• 当View隐藏之后,执行某些callBack方法,OnCompleted或者OnSuccess

Unity应用架构设计(2)——使用中介者模式解耦ViewModel之间通信

当你开发一个客户端应用程序的时候,往往一个单页会包含很多子模块,在不同的平台下,这些子模块又被叫成子View(视图),或者子Component(组件)。越是复杂的页面,被切割出来的子模块就越多,子模块越多,彼此之间需要同步的数据和状态就越频繁,即易产生耦合。那么如何保证在复杂业务情况下,各个子模块之间可以随意通信并保持弱耦合关系,这正是本文所讨论的。

耦合的产生

试想一下,你有这样一下需求,点击 View A中的按钮,View B也需要做出相应的改变。

Unity应用架构设计(2)——使用中介者模式解耦ViewModel之间通信

这不是很简单吗。脑海里迅速出现两种解决方案:

1.View A 主动通知View B做出更新,也就是View A依赖 View B

[技术分享]Unity3D程序脚本反编译分析与加密

前言

对于使用 Unity3D 开发的程序,存在被反编译的风险,也面临着被 dump 内存的威胁,最终引起游戏或工程被抄袭甚至盗版。 下面简单介绍对Unity3D 脚本分析过程,同时提供了对其保护的参考手段。

工具集

dnSpy、Ollydbg、Cheat Engine

背景

大家都知道 Unity3D 使用开源 mono C# 语法 ,所有代码都不是编译到 EXE,而是位于 {APP}uildgame_DataManagedAssembly-CSharp.dll (对于最新的 Unity3D 2017 不是这样),而且 mono 语法只是跟 C# 兼容,但是原理完全不一样,传统的 C# 加壳全部失效,因为 Assembly-CSharp.dll 不是标准的 DLL 加载过程,既不是 PE 的 DLL,也不是 dotNet 的 DLL 加载,而是由 mono.dll 读取 Assembly-CSharp.dll 的 C# 脚本解释执行。这一切不用等官方 IL2CPP 或自己定制 mono 引擎!

反编译

同步内容
--电子创新网--
粤ICP备12070055号