unity学习笔记

monoDevelop乱码问题

这个问题坑了爹很久...

unity自带的monodevelop的项目视图在我电脑(win7)上一直乱码,项目名称,项目结构树,以及文件名称全部显示成方框,今天调了下字体,把默认字体改成Consolas,无心插柳解决了这个问题...

见图片

关于Unity的一些概念和语法

最近一直在利用空闲时间看Unity的API,看的比较细但是实际操作的比较少,昨天有一整天的空闲时间,再加上有了一个还不错的想法,想要把它实现出来,因为用到的模型并不复杂,不需要用到建模软件,也不用到处去搞素材,贴图就随手从收集的图片里做点筛选和剪切的工作,一切看上去很容易搞定,于是开始着手写代码。我从基本的GUI开始写,登陆框,主菜单,这是进入游戏的基本途径,然后NEW
GAME进入游戏的第一关,这里好戏才刚刚开始。

我花了不少时间在挑选贴图和尝试不同的shader上,这些不是重点,当我写到用户输入字符检测的时候傻眼了,我在Unity Answer上面搜到一些代码,有加载System.RegularExpression(加载一部分多余的代码,而我希望尽量把游戏的体积控制在最小)然后用正则表达式做replace的,也有比较简单的字符比较,用Event.current.character与字符‘a‘,‘z‘,‘A‘,‘Z‘,‘0‘,‘9‘进行比较,这是在C#里的代码,在UnityScript里会提示不能把String类型转换成char类型,这个问题牵扯的就比较多了。既然UnityScript不会把String自动转换成char,那我就手动来转换吧?但是对基本类型的方法Unity的文档里

基本上没有提及,那么Unity是怎么处理String,char,Array这些基本类型的?

这里要澄清一些关键的概念。Unity提供三种脚本供我们使用,C#,js和Boo,javascript程序员可能觉得用js会很得心应手,但是不要被表象所迷惑。这个js和我们熟知的ECMA版js有着天大的区别,这就是为什么我倾向于称其为UntyScript而不是javascript的原因,它没有js的无类型声明,没有对象直接量和函数直接量,没有prototype的继承机制,却多了类,联合,extent继承等等。UnityScript是由Boo语言实现的,Boo运行在Mono虚拟机上,转换成本地代码执行,而Mono是一个开源的.net框架。在用到UnityScript的基本类型比如char,String,Array只有直接去查Mono的文档。

上面提到的用户名校验问题实际上用char的一个方法isLetterOrDigit就能轻松解决,但是如果没去看Mono的文档我肯定不知道这点。

说到UnityScript和Javascript的区别,其实官方wiki上有个比较详尽的帖子,我也是用到这些东西,一头扎入繁杂的代码细节中,才发现这些问题,当然有些东西平时也自然而然的用到了,比如var s:int;这样的写法,在js里则是var
s;为了避免类型检测的开销用强类型声明是很有必要的。另外还有一些需要注意的地方:

1、在js中变量声明前的var有些情况下是可以省略的,但是unity中如果声明一个变量没有用var,这个变量的作用域就是全局的。

2、没有prototype继承机制,继承的语法:class Foo extents Bar { };

3、可以定义虚函数,这样子类可以重写它,语法是virtual function Do(){ something; },在父类和子类中都要加virtual关键字

4、在子类中调父类的方法,使用super关键字,比如class Foo extents Bar{ virtual function Do(){ super.Do(); /*...more code..*/ }; }

5、比继承方便简洁的方法是,直接获取父类组件名,使用它的方法,用到Unity提供的函数GetComponent(),另外还有个小技巧,如果在某个脚本里使用static声明一个变量,在其他脚本直接用脚本名.变量就可访问,不用GetComponent()

6、String用下标操作得到char类型,比如"foobar"[3]得到char类型的字符‘b‘

7、UnityScript每个脚本都是继承自Monobehaviour的一个类,这点在C#和Boo里需要显式声明,但是在UnityScript里是隐含和自动完成的,每个脚本名就是一个类名,也就是一个类型名称,在脚本的全局环境里声明的变量实际上是声明为这个脚本类的属性,全局函数实际上是它的方法,在这个类里也可以定义其他的类

8、UnityScript里有两种数组,基本的array以及javascript类似的Array,数组直接量如[1,
2, 3]属于array类型,只能用下标操作,不能用push这样的方法,要声明一个Array必须用var a = new Array()这样的语句,推荐使用.net的List替代它,声明方法和C#有点小区别:var
myList = new List.<int>();注意中间的点符号

9、UnityScript里使用枚举:enum SomeEnum { aaa, bbb, ccc, ddd };

10、因为UnityScript是运行在Mono上的,可以使用Mono库,用import System; import System.IO(在Unity里进行文件操作,可以用这个,比如System.IO.File.Open()来打开一个文件)

11、因为UnityScript是运行在Mono上的,可以使用第三方的库,比如XML-RPC.net等,用import关键字引入其.dll文件

浅谈Unity中的rotation和Quaternion的乘法

动手写游戏以后一个比较切身的体会,就是实际操作能检验很多语言的细节,也许平时看API文档,或者看一些教程的时候并没有深刻的体会,因为大多情况下你只知道了该怎么做,却不知道为什么要这么做,或者怎么想到这么做的,有没有其他的作法?在项目中我要用到一个摄像机环绕的脚本,我发现官方Asset里已经有这样的一个脚本了,打开看它的代码很简单,区区十几行,其中比较关键的一行代码,用摄像机的rotation控制摄像机的
position,这个方法非常巧妙:

position = rotation*Vector3(0.0, 0.0, -distance) + target.position;

Unity定义Quaternion乘法重载形式有两种:

  1. static operator*(lhs: Quaternion, rhs: Quaternion): Quaternion
  2. static operator*(rotation:Quaternion, point:Vector3):Vector3

复制代码

这两个重载是有很大区别的,第一个是计算对一个物体旋转lhs以后再旋转rhs,这整个结果实际上相当于旋转了多少,参数和返回值都是 Quaternion,也就是旋转角度;而第二个是计算笛卡尔坐标系下某一个点,在经过rotation的旋转之后,会出现在那个位置,返回值是
Vector3.

这里target是摄像机所要环绕的物体,distance是要和它保持的距离,摄像机的位置就是算要计算出的点。昨天晚上我一直在想,这个式子为什么会成立,查了Quaternion的*号重载才看出名堂,之前看API文档我也看到过这个,但是并没有想到它还能有这样的妙用。我们知道摄像机的旋转角度,在环绕一个物体的时候,只能是左右和上下方向的旋转,沿着纵深方向的旋转是没有多大意思的(也许你会觉得玩家也会喜欢上下颠倒的角度,但是在我这个项目里并不需要),所以rotation.eulerAngles必定是(x,
y, 0)的形式,之前我在想为什么被转的点要在z轴上而不是在x轴上,如果是在x轴上,那么被旋转点是Vector3(-distance, 0, 0),旋转方向就必须沿y轴和z轴,这和rotation只在x和y轴上有旋转值是矛盾的。

另外一个没有想清楚或者说没有认真去想的问题就是,rotation的角度是怎么计算的。我之前一直认为,rotation是相对轴的旋转角度,比如摄像机环绕脚本中,rotation的x值是相对x轴的旋转角度,但是当这个旋转物体运动到世界坐标系的x轴上时,rotatiion的值似乎应该为0.这样推断显然rotation是相对于自身的坐标系来计算的,但是在本地坐标系来看似乎怎么旋转x,y,z这三个值都应该是0不变,因为本地坐标系是随着物体的旋转一起旋转的。

其实只要知道了Unity中rotation旋转量的计算方式,以上问题就迎刃而解了:

Unity中rotation的类型是Quaternion,用eulerAngles属性可以转换成Vector3表示,我们可以把它当做一个向量,向量的计算是根据起始点和终止点的向量位置计算,但是所有的向量都有一个根据坐标系原点计算的值,这是它位置的凭据,在世界坐标系下是绝对的,而前者是相对的,这两者实际上具有某种统一性。参照这个计算方法,旋转的三个坐标值就能解释得通了。Unity把世界坐标系和本地坐标系做比较,根据本地坐标系相对于世界坐标系的偏转计算绝对旋转角度,根据施加rotation旋转之前的坐标系绝对角度和之后的坐标系绝对角度计算相对旋转角度。那么
rotation的原点在哪呢?在属性面板里把物体的rotation属性归0就能看到,rotation的原点状态就是本地坐标系和世界坐标系x,y, z三个轴方向一致的状态。

下载附件  保存到相册

1 分钟前 上传

更多内容,请访问【狗刨学习网】http://unity.gopedu.com

声明:此篇文档时来自于【狗刨学习网】社区,是网友自行发布的Unity3D学习文章,如果有什么内容侵犯了你的相关权益,请与官方沟通,我们会即时处理。

时间: 2024-12-26 08:15:09

unity学习笔记的相关文章

Unity学习笔记之五为Prefab添加材质

本次笔记中,我们将利用unity来创建并使用材质,把材质添加到我们的Prefab中去. 这一系列教程以及素材均参考自人人素材翻译组出品的翻译教程<Unity游戏引擎的基础入门视频教程>,下载链接附在第二篇学习笔记中. 继续上次笔记中所记录的东西,在Project视图中,ImportedAssets-Meshes-Materials下我们可以看到一个没有纹理的材质球,这个材质是跟随我们的3d Max模型来的默认材质.因为这里我们要添加自己的材质,所以我们直接把这个材质球删除. 删除后,我们看到本

unity学习笔记2

[转]自http://blog.csdn.net/tianyao9hen/article/details/53141141 对于新手学习unity碰撞讲的还是比较清楚的 OnTriggerEnter和OnCollisionEnter的触发条件是不同的,需要在设计的过程中加以关注. 触发的共同要求 碰撞的两个物体A,B,都要有碰撞体(collider),Box Collider,Sphere Collider,Capsule Collider等的任意一种 当A,B都添加刚体(Rigidbody)时

Unity学习笔记之四完善Prefab并添加First Person Controller

好久没学东西并用博客记录了,这个年过的很懒散,慢慢临近开学了,也要提前适应一下,写写东西,这样开学才能更好的进入状态呀-- 本次笔记中,我们将来雕琢一个更加完善的Prefab,并添加一个第一人称角色在场景中. 这一系列教程以及素材均参考自人人素材翻译组出品的翻译教程<Unity游戏引擎的基础入门视频教程>.下载地址附在第二篇笔记中. 上一篇教程我们创建了一个Prefab,在最后我利用四个Prefab通多顶点捕捉建立一个简易的隧道.这只是为了示意Prefab的便捷性,下面我们先把这个隧道删除到只

unity学习笔记一 受到伤害时的颜色变化

最近在跟着视频学做,很简单的demo 就是这个了,看过的人都知道,官方的.刚刚四级的我只能找点国内重制的看了 现在想做的效果就是受到伤害时会变红,让后慢慢平滑过渡到白色 在update方法中如下 void Update() { //鼠标左击模拟受到伤害 if( Input.GetMouseButtonDown(0)) { TakeDamage(30f); } //颜色变白 bodyRenderer.material.color =Color.Lerp(bodyRenderer.material.

Digital Tutors - Introduction to Scripting Shaders in Unity 学习笔记

1. Overview 2. Understanding Shader definition:code that define what the material can do in the environment classification: Surface Shader--容易编写,受光照等因素影响 Vertex and Fragment Shader(Pixels)--非常灵活,代码量大,写得好能提高渲染效率和降低开销 Fixed Function Shader--固定管线shader

Unity学习笔记:预制件Prefab的创建和使用

在制作游戏过程中,会需要通过代码创建多个一模一样的GameObject,比如射击游戏中的子弹,杂兵等各种. 在Unity中一般叫做Prefab预制件,起到模板的作用,可以快速的复制出相同的GameObject. 创建Prefab预制件 一般都会建立独立的目录,用于存放预制件. 第一种方法 在场景中添加一个GameObject,完成相关的设置.然后将其拖拽到Assets/Prefabs中 第二种方法 在Assets/Prefabs中,新建空的预制件 然后将场景中的GameObject拖到这个上面

Unity 学习笔记2

一:创建粒子效果:在Hierarchy面板中,Create->Particle System在Assets文件夹内右键->Import Package->Particle导入粒子效果包在Hierarchy面板中选中Particle System后,可在Inspectors面板中修改粒子系统的相关参数,来达到不同的粒子效果: Max Particle:最大生成粒子数量Prewarm(预热):勾选后,在载入场景之前粒子系统就可以预先生成Start Lifetime:表示每个粒子可持续的时间,

Unity学习笔记(2)——关于Dropdown的学习

今天组长让我写一个界面,其中用到了下拉条,我的印象还停留在以前的NGUI有现成的组件,但是uGUI没有的那阶段,组长跟我说uGUI现在也有了,研究了一下,发现real方便哦,今天就来简单说一下用法吧. Dropdow 用法也就是点开会有一个下拉列表,选中的可以显示.那么第一个问题来了 就是怎么在下拉列表里填上我们所需要的选项,显示我们需要的个数首先呢,遇到一个没有用过的组件不要紧张,可以先看看面板上都有些什么属性,一般来说Inspect界面上的都是可以获取的,有些事可以改的有些的不能改的,如上图

Unity学习笔记 - UI System(一)

转载请注明出处: EnigmaJJ http://www.cnblogs.com/twjcnblog/p/5850648.html 术语 Canvas是Unity的原生组件,Unity的渲染系统使用Canvas来提供绘制在游戏世界中的分层几何结构. Canvas的职责是将他所包含的几何体组合成batches,生成合适的渲染命令并将这些命令发送给Unity的图形系统.所有这些都是由C++代码完成的,被称为rebatch或batch build.当Canvas被标记为需要rebatch时,该Canv