2018-08-21 23:15:32 VRunSoftYanlz 阅读数 849
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

UnityAPI.Transform变换

版本

作者

参与者

完成日期

备注

UnityAPI_Transform_V01_1.0

严立钻

 

2018.08.21

 

 

 

 

 

 

 

 

 

#《UnityAPI.Transform变换》发布说明:

++++“UnityAPI.Transform变换”是对UnityAPITransform类的剖析和拓展;

 

 

 

#Transform变换

#Transform变换

#Transform变换

++++A、Description描述

++++B、Variables变量

++++C、Public Function共有函数

++++D、Message消息

 

 

 

 

 

#A、Description描述

#A、Description描述

++A、Description描述

++++立钻哥哥:对象的位置、旋转和缩放

++++场景中的每一个对象都有一个Transform

--用于储存并操控物体的位置、旋转和缩放;

--每一个Transform可以有一个父级,允许分层次应用位置、旋转和缩放;

--可以在Hierarchy面板查看层次关系;

--他们也支持计数器(Enumerator),因此可以使用循环遍历子对象;

using UnityEngine;

using System.Collections;

 

public class MyTransformClass : MonoBehaviour{

    void MyExample(){

        foreach(Transform child in transform){

            child.position += Vector3.up * 10.0F;

        }

 

    }

 

}    //立钻哥哥:public class MyTransformClass:MonoBehaviour{}

 

namespace UnityEngine{

    public class Transform : Component, IEnumerable{

        ... ...

    }    //立钻哥哥:public class Transform:Component,IEnumerable{}

 

}    //立钻哥哥:namespace UnityEngine{}

 

 

 

 

 

 

 

 

#B、Variables变量

#B、Variables变量

++B、Variables变量

++++B.1、childCount 该变换的子对象数量

++++B.2、eulerAngles 此旋转作为欧拉角度

++++B.3、forward 向前

++++B.4、hasChanged 是否被改变

++++B.5、localEulerAngles 局部欧拉角

++++B.6、localPosition 相对于父级的变换的位置

++++B.7、localRotation 局部旋转

++++B.8、localScale 相对于父级变换的缩放

++++B.9、localToWorldMatrix 局部转世界矩阵

++++B.10、lossyScale 有损缩放

++++B.11、parent 该变换的父对象

++++B.12、position 在世界空间坐标transform的位置

++++B.13、right 向右

++++B.14、root 返回最高层级的变换

++++B.15、rotation 旋转角度

++++B.16、up 向上

++++B.17、worldToLocalMatrix 世界转局部矩阵

 

 

 

 

##B.1、childCount 该变换的子对象数量

##B.1、childCount 该变换的子对象数量

++B.1、childCount 该变换的子对象数量

++++立钻哥哥:Transform.childCount子对象数

int childCount;

 

++Description描述

++++立钻哥哥:该变换的子对象数量

using UnityEngine;

using System.Collections;

 

public class MyTransformClass : MonoBehaviour{

    void MyExample(){

        print(transform.childCount);

    }

 

}    //立钻哥哥:public class MyTransformClass:MonoBehaviour{}

 

 

 

 

 

##B.2、eulerAngles 此旋转作为欧拉角度

##B.2、eulerAngles 此旋转作为欧拉角度

++B.2、eulerAngles 此旋转作为欧拉角度

++++立钻哥哥:Transform.eulerAngles 欧拉角

Vector3 eulerAngles;

 

++Description描述

++++立钻哥哥:此旋转作为欧拉角度

++++x、y、z角代表z轴旋转z度,绕x轴旋转x度,绕y轴旋转y度(这个顺序);

++++仅使用这个变量读取和设置角度为绝对值;

--不要递增它们,当超过角度360度,它将错误;

--使用Transform.Rotate替代;

using UnityEngine;

using System.Collections;

 

public class MyTransformClass : MonoBehaviour{

    public float yRotation = 5.0F;

 

    void Update(){

        yRotation += Input.GetAxis(Horizontal);

        transform.eulerAngles = new Vector3(10, yRotation, 0);

    }

 

    void MyExample(){

        print(transform.eulerAngles.x);

        print(transform.eulerAngles.y);

        print(transform.eulerAngles.z);

    }

 

}    //立钻哥哥:public class MyTransformClass:MonoBehaviour{}

++++不要分别设置欧拉角其中一个轴(例如:eulerAngles.x=10;),因为这将导致偏移和不希望的旋转;

--当设置它们一个新的值时,要同时设置全部(transform.eulerAngles = new Vector3(10, 5.0f, 0););

--Unity从存储在transform.localRotation的旋转自动转换角度;

 

 

 

 

 

##B.3、forward 向前

##B.3、forward 向前

++B.3、forward 向前

++++立钻哥哥:Transform.forward 向前

Vector3 forward;

 

++Description描述

++++立钻哥哥:在世界空间坐标,变换的蓝色轴(也就是Z轴)

using UnityEngine;

using System.Collections;

 

public class MyTransformClass : MonoBehaviour{

    void MyExample(){

        rigidbody.velocity = transform.forward * 10;

    }

 

}    //立钻哥哥:public class MyTransformClass:MonoBeahaviour{}

 

using UnityEngine;

using System.Collections;

 

public class MyTransformClass : MonoBehaviour{

    public float angleBetween = 0.0F;

    public Transform target;

 

    void Update(){

        Vector3 targetDir = target.position - transform.position;

        angleBetween = Vector3.Angle(transform.forward, targetDir);

    }

 

}    //立钻哥哥:public class MyTransformClass:MonoBehaviour{}

 

 

 

 

 

##B.4、hasChanged 是否被改变

##B.4、hasChanged 是否被改变

++B.4、hasChanged 是否被改变

++++立钻哥哥:Transform.hasChanged 是否被改变

bool hasChanged;

 

++Description描述

++++立钻哥哥:此变换自从上次标识是否被设置为false了

++++对变换的任何改变会导致矩阵的重新计算:任意调节它的位置、旋转或缩放;

--请注意此操作,是否在设置此标识之前新旧的值不同,也将不会实际检查;

--因此,对于实例化,transform.position将总是设置此变换的hasChanged,无论是否有实际的变化;

using UnityEngine;

using System.Collections;

 

public class MyTransformClass : MonoBehaviour{

    void OnUpdate(){

        if(transform.hasChanged){

            print(立钻哥哥:The transform has changed!);

            transform.hasChanged = false;

        }

    }

 

}    //立钻哥哥:public class MyTransformClass:MonoBehaviour{}

 

 

 

 

 

##B.5、localEulerAngles 局部欧拉角

##B.5、localEulerAngles 局部欧拉角

++B.5、localEulerAngles 局部欧拉角

++++立钻哥哥:Transform.localEulerAngles 局部欧拉角

Vector3 localEulerAngles;

 

++Description描述

++++立钻哥哥:旋转作为欧拉角度,相对于父级的变换旋转

++++x、y、z角代表绕z轴旋转z度,绕x轴旋转x度,绕y轴旋转y度(这个顺序);

++++仅使用这个变量读取和设置角度为绝对值;

--不要递增它们,当超过角度360度,它将错误;

--使用Transform.Rotate替代;

using UnityEngine;

using System.Collections;

 

public class MyTransformClass : MonoBeahaviour{

    void MyExample(){

        print(transform.localEulerAngles.x);

        print(transform.localEulerAngles.y);

        print(transform.localEulerAngles.z);

    }

 

}    //立钻哥哥:public class MyTransformClass:MonoBehaviour{}

++++Unity从存储在transform.localrotation的旋转自动转换角度;

 

 

 

 

 

##B.6、localPosition 相对于父级的变换的位置

##B.6、localPosition 相对于父级的变换的位置

++B.6、localPosition 相对于父级的变换的位置

++++立钻哥哥:Transform.localPosition 局部位置

Vector3 localPosition;

 

++Description描述

++++立钻哥哥:现对于父级的变换的位置

++++如果该变换没有父级,那么等同于Transform.position;

using UnityEngine;

using System.Collections;

 

public class MyTransformClass : MonoBehaviour{

    void MyExample(){

        transform.localPosition = new Vector3(0, 0, 0);

        print(transform.localPosition.y);

    }

 

}    //立钻哥哥:public class MyTransformClass:MonoBehaviour{}

++++注意当计算世界的位置时,父级变换的世界旋转和缩放被应用到自身的位置;

--意思是说:Transform.position的1个单位是1个单位,Transform.localPositon的1个单位将由所有父级的缩放获得缩放,简单来说自身位置的1单位将受所有上级的缩放影响

 

 

 

 

 

##B.7、localRotation 局部旋转

##B.7、localRotation 局部旋转

++B.7、localRotation 局部旋转

++++立钻哥哥:Transform.localPosition 局部旋转

Quaternion localRotation;

 

++Description描述

++++立钻哥哥:该变换的旋转角度相当于父级变换的旋转角度

++++Unity作为四元数存旋转角度;

--要旋转一个物体,使用Transform.Rotate,使用Transform.localEulerAngles为设置作为欧拉角的旋转角度;

using UnityEngine;

using System.Collections;

 

public class MyTransformClass : MonoBehaviour{

    void MyExample(){

        transform.localRotation = Quaternion.identity;

    }

 

}    //立钻哥哥:public class MyTransformClass:MonoBehaviour{}

 

 

 

 

 

##B.8、localScale 相对于父级变换的缩放

##B.8、localScale 相对于父级变换的缩放

++B.8、localScale 相对于父级变换的缩放

++++立钻哥哥:Transform.localScale 局部缩放

Vector3 localScale;

 

++Description描述

++++立钻哥哥:相对于父级变换的缩放

using UnityEngine;

using System.Collections;

 

public class MyTransformClass : MonoBehaviour{

    void MyExample(){

        transform.localScale += new Vector3(0.1F, 0, 0);

    }

 

}    //立钻哥哥:public class MyTransformClass:MonoBehaviour{}

 

 

 

 

 

##B.9、localToWorldMatrix 局部转世界矩阵

##B.9、localToWorldMatrix 局部转世界矩阵

++B.9、localToWorldMatrix 局部转世界矩阵

++++立钻哥哥:Transform.localToWorldMatrix 局部转世界矩阵

Matrix4x4 localToWorldMatrix;

 

++Description描述

++++立钻哥哥:变换点的矩阵从局部坐标到世界坐标(只读)

++++如果不熟悉使用矩阵为坐标转换,使用Transform.TransformPoint代替;

++++重要:如果设置shader参数,必须使用Renderer.localToWorldMaxtrix替代;

 

 

 

 

 

##B.10、lossyScale 有损缩放

##B.10、lossyScale 有损缩放

++B.10、lossyScale 有损缩放

++++立钻哥哥:Transform.lossyScale 有损缩放

Vector3 lossyScale;

 

++Description描述

++++立钻哥哥:该对象的整体缩放(只读)

++++请注意:如果有一个带有缩放的父变换和有任意旋转的子变换,此缩放将有偏差;

--因此缩放不能正确的表示在3组件的向量,而是一个3x3矩阵;

--这样表示工作十分不方便,lossyScale是个和方便的属性,它尽量匹配实际世界缩放,如果物体不是有偏差的,这个值将是完全正确的,如果物体包含偏差,这个值也不会有很大的不同;

using UnityEngine;

using System.Collections;

 

public class MyTransformClass : MonoBehaviour{

    void MyExample(){

        print(transform.lossyScale);

    }

 

}    //立钻哥哥:public class MyTransformClass:MonoBehaviour{}

 

 

 

 

 

##B.11、parent 该变换的父对象

##B.11、parent 该变换的父对象

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

++立钻哥哥推荐的拓展学习链接(Link_Url)

++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/

++++Unity5.x用户手册https://blog.csdn.net/VRunSoftYanlz/article/details/81712741

++++Unity面试题ABChttps://blog.csdn.net/vrunsoftyanlz/article/details/78630687

++++Unity面试题Dhttps://blog.csdn.net/VRunSoftYanlz/article/details/78630838

++++Unity面试题Ehttps://blog.csdn.net/vrunsoftyanlz/article/details/78630913

++++Unity面试题Fhttps://blog.csdn.net/VRunSoftYanlz/article/details/78630945

++++Unity知识点0001https://blog.csdn.net/vrunsoftyanlz/article/details/80302012

++++Unity知识点0008https://blog.csdn.net/VRunSoftYanlz/article/details/81153606

++++Unity引擎基础https://blog.csdn.net/vrunsoftyanlz/article/details/78881685

++++Unity面向组件开发https://blog.csdn.net/vrunsoftyanlz/article/details/78881752

++++Unity物理系统https://blog.csdn.net/vrunsoftyanlz/article/details/78881879

++++Unity2D平台开发https://blog.csdn.net/vrunsoftyanlz/article/details/78882034

++++UGUI基础https://blog.csdn.net/vrunsoftyanlz/article/details/78884693

++++UGUI进阶https://blog.csdn.net/vrunsoftyanlz/article/details/78884882

++++UGUI综合https://blog.csdn.net/vrunsoftyanlz/article/details/78885013

++++Unity动画系统基础https://blog.csdn.net/vrunsoftyanlz/article/details/78886068

++++Unity动画系统进阶https://blog.csdn.net/vrunsoftyanlz/article/details/78886198

++++Navigation导航系统https://blog.csdn.net/vrunsoftyanlz/article/details/78886281

++++Unity特效渲染https://blog.csdn.net/vrunsoftyanlz/article/details/78886403

++++Unity数据存储https://blog.csdn.net/vrunsoftyanlz/article/details/79251273

++++Unity中Sqlite数据库https://blog.csdn.net/vrunsoftyanlz/article/details/79254162

++++WWW类和协程https://blog.csdn.net/vrunsoftyanlz/article/details/79254559

++++Unity网络https://blog.csdn.net/vrunsoftyanlz/article/details/79254902

++++C#事件https://blog.csdn.net/vrunsoftyanlz/article/details/78631267

++++C#委托https://blog.csdn.net/vrunsoftyanlz/article/details/78631183

++++C#集合https://blog.csdn.net/vrunsoftyanlz/article/details/78631175

++++C#泛型https://blog.csdn.net/vrunsoftyanlz/article/details/78631141

++++C#接口https://blog.csdn.net/vrunsoftyanlz/article/details/78631122

++++C#静态类https://blog.csdn.net/vrunsoftyanlz/article/details/78630979

++++C#中System.String类https://blog.csdn.net/vrunsoftyanlz/article/details/78630945

++++C#数据类型https://blog.csdn.net/vrunsoftyanlz/article/details/78630913

++++Unity3D默认的快捷键https://blog.csdn.net/vrunsoftyanlz/article/details/78630838

++++游戏相关缩写https://blog.csdn.net/vrunsoftyanlz/article/details/78630687

++++设计模式简单整理https://blog.csdn.net/vrunsoftyanlz/article/details/79839641

++++专题:设计模式(精华篇)https://blog.csdn.net/VRunSoftYanlz/article/details/81322678

++++U3D小项目参考https://blog.csdn.net/vrunsoftyanlz/article/details/80141811

++++UML类图https://blog.csdn.net/vrunsoftyanlz/article/details/80289461

++++U3D_Shader编程(第一篇:快速入门篇)https://blog.csdn.net/vrunsoftyanlz/article/details/80372071

++++U3D_Shader编程(第二篇:基础夯实篇)https://blog.csdn.net/vrunsoftyanlz/article/details/80372628

++++框架知识点https://blog.csdn.net/VRunSoftYanlz/article/details/80862879

++++游戏框架(UI框架夯实篇)https://blog.csdn.net/vrunsoftyanlz/article/details/80781140

++++游戏框架(初探篇)https://blog.csdn.net/VRunSoftYanlz/article/details/80630325

++++Lua快速入门篇(基础概述)https://blog.csdn.net/VRunSoftYanlz/article/details/81041359

++++Lua快速入门篇(XLua教程):https://blog.csdn.net/VRunSoftYanlz/article/details/81141502

++++Lua快速入门篇(Xlua拓展):https://blog.csdn.net/VRunSoftYanlz/article/details/81173818

++++UnityAPI.Rigidbody刚体https://blog.csdn.net/VRunSoftYanlz/article/details/81784053

++++UnityAPI.Material材质https://blog.csdn.net/VRunSoftYanlz/article/details/81814303

++++UnityAPI.Android安卓https://blog.csdn.net/VRunSoftYanlz/article/details/81843193

++++UnityAPI.AndroidJNI安卓JNIhttps://blog.csdn.net/VRunSoftYanlz/article/details/81879345

++++UnityAPI.Transform变换https://blog.csdn.net/VRunSoftYanlz/article/details/81916293

++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/

 

--_--VRunSoft:lovezuanzuan--_--

2016-12-13 19:27:25 LXL_815520 阅读数 549
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

一,概述

    Time是unity中获取当前的系统时间的类,提供了从unity获取相关时间信息的接口.通过Time的相关时间信息接口,我们可以在程序中实现对时间相关的操作.

二,类变量(Class Variables)

   1>time
       从游戏开始(程序开始运行的那一刻)到到现在所用的时间(.time调用的那一刻) (只读)。
   2>timeSinceLevelLoad
       表示从当前Scene开始到目前为止的时间,也会随着暂停操作而停止 (只读)。
        示例: "player" 是下一场景的某个组件的脚本.程序刚运行时处在上一场景.通过上一场景,跳转到下一场景.验证TimeSinceLevel 和time接口.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class player : MonoBehaviour {
	public float speed = 90;
	// Use this for initialization
	void Start () {
	}
	// Update is called once per frame
	void Update () {
		transform.Rotate(Vector3.up* Time.deltaTime *speed);
	}

    public void ChangeSpeed (float speedNew)
	{
		Debug.Log ("TimeSinceLevel" + Time.timeSinceLevelLoad);
		Debug.Log ("Time" + Time.time);
		this.speed = speedNew;
	}
}
        打印:
         
   3>deltaTime
       表示从上一帧到当前帧时间,以秒为单位(只读)。
       因为void Update () 或void FixedUpdate() 是以每帧进行刷新的. 如果想要一个值根据每帧的变化而变化(增加或减少) ,你应该使用 Time.deltaTime来
乘以这个值。这样才能使得变化的效果依赖于单位时间,而不是帧频。这样运动的效果更符合现实。 
        void Update () {
	}
   4>fixedTime
        表示FixedUpdate已经执行的时间。
   5>fixedDeltaTime
       表示以秒计间隔,在物理和其他固定帧率进行更新 (像MonoBehaviour的FixedUpdate),在Edit->ProjectSettings->Time的Fixed Timestep可以自行设置
   6>maximumDeltaTime
      表示一帧能获得的最长时间。物理和其他固定帧速率更新(类似MonoBehaviour FixedUpdate)。
   7>smoothDeltaTime
       表示一个平稳的deltaTime,根据前 N帧的时间加权平均的值(只读)。
   8> timeScale
       时间缩放,默认值为1。若设置<1,表示时间减慢;若设置>1,表示时间加快;若设置=0,则游戏暂停。可以用来加速、减速和暂停游戏,非常有用。
   9>frameCount
       已经传递的帧的总数(只读)。
 10>realtimeSinceStartup
       表示自游戏开始后的总时间,即使暂停也会不断的增加(只读)。
 11>captureFramerate
       如果captureFramerate设置比0大的值,时间会在每帧 (1.0 / captureFramerate) 前进,不考虑真实时间。
 12>unscaledDeltaTime
       不考虑timescale时候与deltaTime相同,若timescale被设置,则无效(只读)。
 13>unscaledTime
      不考虑timescale时候与time相同,若timescale被设置,则无效 (只读)。

2017-12-01 17:00:49 zhenghongzhi6 阅读数 8280
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

本文首发于“洪流学堂”公众号。
洪流学堂,让你快人几步!你好,我是你的技术探路者郑洪智,你可以叫我大智(vx: zhz11235)。

源码地址

https://github.com/zhenghongzhi/WitBaiduAip

功能概述

1 语音识别

  1. 从麦克风录制音频
  2. AudioClip的音频数据转换为百度语音识别的PCM16格式
  3. 百度语音识别Restful接口的封装以及一个测试场景

2 语音合成

  1. 百度语音合成Restful接口的封装以及一个测试场景
  2. mp3格式运行时转为AudioClip进行播放

为什么不使用百度的C# SDK
百度的C# SDK使用了一些Unity不支持的特性,直接导入unity不能用
而且百度C# SDK只是封装了Restful的接口,功能上并没有增多
自己编写更简洁

更新说明

2018-08-22更新

根据百度API的更新,语音合成性能优化,直接使用原生格式,移除第三方插件

2018-03-28更新

加入平台判断,更好的支持android和ios

2018-01-11更新

在工程中加入了语音合成

2018-01-02更新

应广大小伙伴的要求,对工程进行了重构,放出github源码
https://github.com/zhenghongzhi/WitBaiduAip

2017-12-23更新

教程首发


洪流学堂,让你快人几步
欢迎关注“洪流学堂”微信公众号

2017-07-08 12:51:52 qq_22991695 阅读数 0
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

Unity3d中UI开发的MVC模式 - 道心惟纯 - CSDN博客
关闭
var username = "jjiss318"; var _blogger = username; var blog_address = "http://blog.csdn.net/jjiss318"; var static_host = "http://static.blog.csdn.net"; var currentUserName = "";
    <div id="body">
        <div id="main">
            <div class="main">
                    <div class="ad_class">
window.quickReplyflag = true; var isBole = false; var fasrc="http://my.csdn.net/my/favorite/miniadd?t=Unity3d%e4%b8%adUI%e5%bc%80%e5%8f%91%e7%9a%84MVC%e6%a8%a1%e5%bc%8f&u=http://blog.csdn.net/jjiss318/article/details/44220081"

Unity3d中UI开发的MVC模式

    <div class="article_manage clearfix">
    <div class="article_r">
        <span class="link_postdate">2015-03-12 13:58</span>
        <span class="link_view" title="阅读次数">15914人阅读</span>
        <span class="link_comments" title="评论次数"> <a href="#comments" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_pinglun'])">评论</a>(3)</span>
        <span class="link_collect tracking-ad" data-mod="popu_171"> <a href="javascript:void(0);" onclick="javascript:collectArticle('Unity3d%e4%b8%adUI%e5%bc%80%e5%8f%91%e7%9a%84MVC%e6%a8%a1%e5%bc%8f','44220081');return false;" title="收藏">收藏</a></span>
         <span class="link_report"> <a href="#report" onclick="javascript:report(44220081,2);return false;" title="举报">举报</a></span>

    </div>
</div>    <style type="text/css">        
        .embody{
            padding:10px 10px 10px;
            margin:0 -20px;
            border-bottom:solid 1px #ededed;                
        }
        .embody_b{
            margin:0 ;
            padding:10px 0;
        }
        .embody .embody_t,.embody .embody_c{
            display: inline-block;
            margin-right:10px;
        }
        .embody_t{
            font-size: 12px;
            color:#999;
        }
        .embody_c{
            font-size: 12px;
        }
        .embody_c img,.embody_c em{
            display: inline-block;
            vertical-align: middle;               
        }
         .embody_c img{               
            width:30px;
            height:30px;
        }
        .embody_c em{
            margin: 0 20px 0 10px;
            color:#333;
            font-style: normal;
        }
</style>
<script  type="text/javascript">
    $(function () {
        try
        {
            var lib = eval("("+$("#lib").attr("value")+")");
            var html = "";
            if (lib.err == 0) {
                $.each(lib.data, function (i) {
                    var obj = lib.data[i];
                    //html += '<img src="' + obj.logo + '"/>' + obj.name + "&nbsp;&nbsp;";
                    html += ' <a href="' + obj.url + '" target="_blank">';
                    html += ' <img src="' + obj.logo + '">';
                    html += ' <em><b>' + obj.name + '</b></em>';
                    html += ' </a>';
                });
                if (html != "") {
                    setTimeout(function () {
                        $("#lib").html(html);                      
                        $("#embody").show();
                    }, 100);
                }
            }      
        } catch (err)
        { }

    });
</script>
  <div class="category clearfix">
    <div class="category_l">
       <img src="http://static.blog.csdn.net/images/category_icon.jpg">
        <span>分类:</span>
    </div>
    <div class="category_r">
                <label  onclick="GetCategoryArticles('1059978','jjiss318','top','44220081');">
                    <span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_fenlei']);">Unity3D<em>(29)</em></span>
                  <img class="arrow-down" src="http://static.blog.csdn.net/images/arrow_triangle _down.jpg" style="display:inline;">
                  <img class="arrow-up" src="http://static.blog.csdn.net/images/arrow_triangle_up.jpg" style="display:none;">
                    <div class="subItem">
                        <div class="subItem_t"><a  href="http://blog.csdn.net/jjiss318/article/category/1059978"  target="_blank">作者同类文章</a><i class="J_close">X</i></div>
                        <ul class="subItem_l" id="top_1059978">                            
                        </ul>
                    </div>
                </label>                    
    </div>
</div>

原文:http://engineering.socialpoint.es/MVC-pattern-unity3d-ui.html

动机

        和游戏开发的其他模块类似,UI一般需要通过多次迭代开发,直到用户体验近似OK。另外至关重要的是, 我们想尽快加速迭代的过程。使用MVC模式来进行设计,已经被业界证明了是可以解耦屏幕上的显示,如何控制用户的输入对显示的改变,以及如何根据应用的状态进行改变。MVC模式提供了以下好处:

(1) 可以修改UI的外观,而不用修改一行代码

(2) 在不同的组件里面可以共享同一套逻辑代码,用来创建复杂的视图;

(3) 可以用很小的代价来改变UI的实现,比如正在使用NGUI , 但将来会切换成 UGUI


代码示例

这里提供了一个MVC在使用NGUI开发的例子,需要注意的是,我们不能在代码中提供NGUI库,毕竟它是收费的,所以想运行起来的话,需要自己导入NGUI库。接下来的内容都会以这个例子的代码作为基准,所以可以在阅读时可以先把代码下载下来。


总体概述

这是一张简图,从宏观的角度描述了代码中MVC模式的不同部分。

        

Model

  传统的MVC中的Model,我们都很熟悉:

        (1) 不保存任何View的数据或者View的状态

        (2) 只能被Controller或者其他Model访问

        (3) 会触发事件来通知外部系统进行处理和变更

这里的Model是使用Plain Old C# Objects(POCOs)来实现的,就是不依赖于任何外部库的C#代码。这是例子中对于PlayerModel的链接地址,它表示了Player的数据,包括HitPoints,XP和level,使用两个属性来进行访问。我们可以增加XP点,而Model则会raise一个XPGained事件。当获得升级的经验时,Level属性会更新,并raise一个LevelUp事件。


 View

概念上的view一般就是在屏幕上渲染的东西。View的职责包括:

   (1) 处理用户绘制元素的reference,包括纹理,特效等

(2) 播放动画

(3) 布局

(4) 接受用户输入

在代码这个特定例子中,View的实现使用了NGUI,所以它只是Unity工程中的一个Prefab。但这个实现细节需要解耦。想了解更多学术上的知识的话,还可以看下Passive View。View不知道工程中其他部分的任何事情,无论是数据还是逻辑。这样其他的代码必选显式地告诉View显式什么,播放什么动画等等。


Controller

Controller是连接Model和View的桥梁。它会保存View的状态,并且根据外部事件来更新View的状态:

(1) 持有View所需要的应用状态

(2) 控制View的流程

(3) 根据状态show/hides/activates/deactivates/updates View或者View的某些部分。如controller可临时将攻击按钮Distable掉,因为此时攻击处于冷却状态,冷却状态一过,controller会re-enable这个按钮。

(4) load/Instantiate需要的assets,比如显示particles, 动态改变sprites等

   (5) 处理用户在View中触发的事件,比如用户按下了一个按钮;处理Model触发的事件,比如player获得了      XP并触发了升级,所以controller就更新了View中的Level Number

这就是MVC模式中定义的三个基本元素。但在这个例子中,我们加入了另外一个中间层来进一步解耦NGUI的View实现,称之为:


ViewPresenter

一个ViewPresenter位于View和Controller之间,作为一个接口存在,暴露了对于一个View来说是普适的操作集合,无论View本身是基于什么库来实现的(NGUI,UGUI等)

比如一个游戏中的按钮,一般来说都有以下功能集:

(1) 设置按钮label中的文字

(2) 修改按钮的背景图

(3) enable/disable用户输入

(4) 当用户点击按钮时,进行Notify

这些都是与UI具体实现无关的操作,在任何一个UI toolkit中都能找到这些操作。ViewPresenter实现为一个MonoBehaviour被Attach到NGUI View的Prefab上,所以可以在Controller中通过GameObject.GetComponent来得到它来进行功能调用。由于ViewPresenter是游戏代码和UI代码的桥梁,所以它不能完全独立于屏幕渲染的底层实现。在这个例子中,ViewPresenter需要持有NGUI Widgets(比如UIButton,UILabel等)的引用,用来于它们进行交互。其实ViewPresenter实际上是一个适配器模式(Adapter pattern)的实现:  我们额外创建了定制的接口来对应用进行访问。这些引用必须在Inspector或者其他代码中进行设置。

幸运的是,这个设置过程可以部分自动化,可以参看ViewPresenter.AutoPopulateDeclaredVidgets(),虽然ViewPresenter和某个特定的UI系统有耦合,但使用创建用于Controller的接口得到了一个好处:如果需要更换GUI库,只需要修改修改ViewPresenter的实现,而不需要修改ViewPresenter的接口以及controller的任何逻辑。

之所以将其称之为ViewPresenter是因为它与Model-View-presenter模式中的Presenter有些类似,只不过Presenter可以访问Model,但ViewPresenter不可以。

ViewPreseter可以持有一些player标识的状态,比如View存储了不同的颜色来提示heath point( 以健康度作为基准来提示满血,充裕,虚弱之类的),这些值可以暴露出来作为公共属性,运行在运行时通过inspector来进行实时修改。但无论如何,ViewPresenter不能持有应用程序逻辑的任何状态,而逻辑由controller管理,ViewPresenter根本不应该知道什么样的heath level是表示low。

比如,如果扩展PlayerController来处理Hit points,可以增加一个方法来改变label的颜色,当处于low health的时候:

public class PlayerController
{   // ...
    void UpdateHitPointsUI()
    {
        if (Player.HasLowHitPoints)
        {
            HitPointsViewLabel.ShowLowHealthColor();
        }
        else
        {
            HitPointsViewLabel.ShowNormalHealthColor();
        }
    }

}

           如果你想创建一个非常特定或者复杂的UI,并在工程中进行重用的话,这个方法可能有些过度设计了。在这个Sample代码中,我们很轻松地进行了如此处理:controller只需要修改ViewPresenter中的一个UnityEngine.Color类型的属性。

Handling UI events

NGUI提供了一个设计良好的时间系统,在任何定义了某事件hander的MonoBehaviour中都可以触发这个事件。这样就解耦了触发事件的MonoBehaviour和处理这个事件的MonoBehaviour。然后,强大的功能增加了结构混乱的机会,因为可以使用任何MonoBehaviour作为事件的handler,很随手的就把scene中的某个monoBehaviour拖放到inspector的handler上了,这样当创建一个包含了若干个控件的复杂View时,就容易得到一个难以track的依赖,这个依赖图的复杂度可以非常快速地增长。

为了防止代码中混乱的蔓延,我们遵守了一个非常容易的原则:所有的View的UI事件只能被attatch到这个View的ViewPresenter来进行处理。ViewPresenter会捕获NGUI的事件,并Raise一个 .net的Event作为回应。其他的代码只订阅那个.net时间。这么做是因为需要将UI事件的具体实现与NGUI解耦,因为这样做我们使用代码中的事件,而不是inspector的事件。在我们的观点中,这是一个更安全的方法:可以很容易地在IDE中搜索处理这个Event的代码;而且更加类型安全:(如果你删除了一个处理这个Event的MonoBehavior,你只会发现控件在Play Mode中停止工作了), 可以允许设置Event上的各个参数。当然我们需要在View Presenter中封装NGUI的Event,但我们的使之自动化:看看这个代码ButtonViewPresenter.wireUIEvents()


创建复杂的View

现在已经有一些模块可以支持建造了,通过组合来创建一些更复杂的View变得容易:由若干个UI prefab来组合成一个新的View, 并为这个组合出来的view创建一个新的ViewPresenter, 将子View中的ViewPresenter暴露出来,这样就可以在controller中进行访问了。


这个组合出来的新ViewPresenter,可以在这里找到。

结语

欢迎告知使用这种方法的感受,并欢迎告知你们在游戏UI开发中的独特方法,欢迎各种反馈。

另外,如果不使用NGUI,而是使用Unity3D的GUI,那么实现ViewPresenter的OnGUI方法为Unity3D自带的GUI API将会是一个不错的体验。


2018-09-29 08:52:00 weixin_34306676 阅读数 0
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

Unity Manual 用户手册

Welcome to Unity.

欢迎使用Unity。

Unity is made to empower users to create the best interactive entertainment or multimedia experience that they can. This manual is designed to help you learn how to use Unity, from basic to advanced techniques. It can be read from start to finish or used as a reference.

Unity为使用户创建最佳的交互式娱乐或多媒体体验。该手册用于帮助你学习怎样使用Unity,从基础到高级技术。你可以从头到尾阅读来系统学习或仅作为一个参考。

The manual is divided into different sections. The first section, User Guide, is an introduction to Unity's interface, asset workflow, and the basics of building a game. If you are new to Unity, it is recommended that you start learning by reading the Unity Basics subsection.

本手册分为不同的部分。
第1部分,用户指南,是介绍Unity的接口,资源工作流程和构造一个游戏的基础。如果你新接触Untiy,建议你从基础部分开始阅读。

The Android Guide addresses Android specific topics such as setting up the Android SDK and general development questions.

安卓指南,安卓的特定主题,如设置Android SDK和一般开发问题。

The next section, FAQ, is a collection of frequently asked questions about performing common tasks that require a few steps.

第2部分,常见问题,开发中的一些常见问题。

The last section, Advanced, addresses topics such as game optimization, shaders, file sizes, and deployment.

第3部分,高级,这类主题如,游戏优化,着色器,文件大小和部署。

When you're done reading, be sure to take a look at the Reference Manual and the Scripting Reference for further details about the different possibilities of constructing your games with Unity.

当你阅读完本手册,一定要看组件参考手册脚本参考手册来进一步了解使用Unity。

If you find that any question you have is not answered in this manual please ask on Unity Answers or Unity Forums. You'll definitely find your answer there.

如果在本手册没有找到需要的答案,请在Unity AnswersUnity Forums提问,你一定会找到答案。

iOS
Android
Desktop

转载于:https://www.cnblogs.com/xinxianquan/p/9721817.html

Unity3d面试题

阅读数 0