C#程序员整理的Unity 3D笔记(九):Unity 3D测试浅析

Unity中的组件上的类,是不能new的,必须通过组件去获取,new出来的东西是null。

if (amainfo.nameHash == Animator.StringToHash("Base Layer.idle"))

{

      m_animator.SetBool("Run", true);

}

代码无法执行时,在navigation面板中点击Bake,如下图

clip_image002  C#程序员整理的Unity 3D笔记(九):Unity 3D测试浅析 clip image002 thumb

必须为碰撞体添加碰撞组件,否则Physics.Raycast函数无法检测到

删除destory时的时间,否则产生的多线程会导致计数不准确!

Unity3D自带测试工具,只需要在Asset Store中下载,然后导入,完成后菜单项会有Unity Test Tools项(如下图),完成了插件的导入,就可以进行单元测试了。

clip_image004  C#程序员整理的Unity 3D笔记(九):Unity 3D测试浅析 clip image004 thumb

clip_image006  C#程序员整理的Unity 3D笔记(九):Unity 3D测试浅析 clip image006 thumb

Unity3D的单元测试和VS2010的单元测试很几乎一样,如果接触过VS的单元测试,使用Unity3D的单元测试会简单很多。

1. 新建‘Editor‘文件夹,在文件夹中建一个单元测试的类,如下图

clip_image008  C#程序员整理的Unity 3D笔记(九):Unity 3D测试浅析 clip image008 thumb

2. 在测试类文件中添加需要的测试方法,基本和VS中的单元测试一样,如下图所示:

clip_image010  C#程序员整理的Unity 3D笔记(九):Unity 3D测试浅析 clip image010 thumb

3. 完成测试类的新建,点击Unity Test Tools 菜单中的Unit Test Runner 就可以进行单元测试,如下图:

clip_image012  C#程序员整理的Unity 3D笔记(九):Unity 3D测试浅析 clip image012 thumb

4. 点击进行单元测试菜单后,进入测试界面,点击开始测试按钮,可以看到我们新建的测试类以及包含需要测试的方法,当时绿色的对号时,表示测试通过,否则表示测试失败,如下图:

clip_image014  C#程序员整理的Unity 3D笔记(九):Unity 3D测试浅析 clip image014 thumb

以上就是Unity3D单元测试运行的基本步骤,如果熟悉VS开发平台的话,就会发现和VS的单元测试几乎是完全一样的。

集成测试Integration

由于单元测试只能测试单独函数的逻辑,无法模拟真正的游戏运行场景,所以一般游戏场景的模拟还是要用到集成测试。Unity3D的集成测试会调用Unity的运行函数,逐个测试用例。相当于实际游戏运行环境。

集成测试分为动态集成测试和普通集成测试

1. 普通集成测试,如果要测试某个GameObject,需要添加下图2的脚本组件,在clip_image016  C#程序员整理的Unity 3D笔记(九):Unity 3D测试浅析 clip image016 thumb菜单中,添加完成后,可以对组件进行测试,运行clip_image018  C#程序员整理的Unity 3D笔记(九):Unity 3D测试浅析 clip image018 thumb,即可以看到结果。如下图:

clip_image020  C#程序员整理的Unity 3D笔记(九):Unity 3D测试浅析 clip image020 thumb

图1

clip_image022  C#程序员整理的Unity 3D笔记(九):Unity 3D测试浅析 clip image022 thumb

图2

每一项集成测试都需要通过断言的组件的判断,这种普通测试只是用于一些简单的测试,如坐标移动范围,是否需要可见等。

动态集成测试

新建测试 New Test ,在它之下创建一个GameObject,创建TestScript脚本绑定在GameObject。 如果在该场景名下,动态测试脚本会自动挂载到测试面板中。如下图:

clip_image024  C#程序员整理的Unity 3D笔记(九):Unity 3D测试浅析 clip image024 thumb

新建一个.cs文件里,创建若干个测试类。再针对不同模块,分成不同测试场景,进行测试,即可。也能支持NGUI等许多插件。按钮响应事件利用反射强制调用一下。

C#程序员整理的Unity 3D笔记(五):Unity3D朝向浅析

1. LookAt(gameObject)用法:

假定一个人物模型,使用LookAt方法使其朝向某个目标,但是在使用时会发现很多很二的地方,你会发现,有的人是背朝着目标,有的是面朝向目标,有的甚至都是倒立的朝向目标,所以能否正确的使用该方法,还是有很多的地方需要了解。

LookAt函数的定义如下

void LookAt(Transform target,Vector3 worldUp = Vector3.up);

target    :Object to point towards

worldUp:Vector specifying the upward direction.

根据官方的文档描述,该函数的功能是,旋转自身,使得当前对象的正z轴指向目标对象target所在的位置。

而对于worldUp的描述是,在完成上面的旋转之后,继续旋转自身,使得当前对象的正y轴朝向与worldUp所指向的朝向一致。

所以一定要弄好物体的朝向轴,也就是物体的Z轴一定要是物体的正反向,就比如说人,Z轴一定要让是人的面朝方向,不然会有很多问题

如果以上方法还是不能解决,可以试一个极端的方法,基本可以解决:

m_transform.right=Vector3.Cross(mainGame.transform.position,Vector3.up);

旋转朝向某个gameobj 使用Quaternion.LookRotation(rpos) rpos为两个向量相减得出

 

2. 鼠标控制物体的移动

现在的很多 鼠标控制物体移动的游戏都是上帝视图来开发的,即某一个轴的向量为0。如一般的RPG游戏,dota等,都是鼠标控制英雄的移动方向, 由于鼠标点击获取的是一个Vector3的Z方向为0,所以要把获取的这个Vector3向量放到三维游戏中,一般都是需要将获取的向量投影到物体移动面上,一般使用的方法都是射线,代码如下:

Vector3 mousedir = Input.mousePosition;

RaycastHit hit;

Ray ray = Camera.main.ScreenPointToRay(mousedir);

if (Physics.Raycast(ray, out hit, 1000, musk))

{

enddir = hit.point;

}

m_transform.position = Vector3.MoveTowards(m_transform.position, enddir, speed * Time.deltaTime);

其中musk为所要投影的面,1000为距离。

至于3维环境中鼠标控制物体移动,现在还没有想到好的办法解决,欢迎大家提出宝贵想法。

Unity中的组件上的类,是不能new的,必须通过组件去获取,new出来的东西是null。

C#程序员整理的Unity 3D笔记(一)

1. Horizontal 水平轴,Vertical 垂直位移,它们只是一个增量,取值的范围为-1到1.

2. Mouse X 鼠标水平移动,代码如下

this.transform.Translate(condition * Time.deltaTime * multiple, 0, 0)

3. Mouse Y 鼠标垂直垂直移动 ,代码如下

4. this.transform.Rotate(Vector3.left, condition * 10);

5. 物体朝向某个物体的方位this.transform.LookAt(transform);

6. Camera 中的Depth参数表示摄像机的视角,其中数值较大的在数值较小的上面(即Y值较大)

7. Camera clip_image002  C#程序员整理的Unity 3D笔记(一) 2Q的属性代表视角度的范围,范围以外的视角是黑色

8. Camera 的Audio Listener 表示耳朵,可以监听目标发出的声音

9. Mesh 网格是用来建造复杂的GameObject,比如坦克,汽车等

10. Material 材质,表示GameObject的物理属性

11. Texture 纹理,表示GameObject表面是啥样子

12. Render Setting 设置整个Scene的天空盒子,Compont–>Rendering—>Skybox设置摄像机的天空盒子,摄像机的天空盒子优先级高于Scene的,勾选Fog设置雾效果

13. Material–>Inspector视图—-> RenderFX—-> SkyBox 自制天空盒子,自制天空盒子的材料将Warp Mode 设置成Damp可以无缝连接六张图片

14. GameObject 的Mesh Render属性控制游戏场景中物体的可见性,勾选Static属性,可以使物体不会移动

15. this.transform.TransformPoint可以将坐标点从Local—> world

16. this.transform.InverseTransformDirection以将坐标点从world —> Local

17. this.transform.TransformDirection方向从Local—> world

18. this.transform.InverseTransformDirection方向从world —> Local

19. GUI中屏幕坐标系以左上角为原点,右下角为(Screen.Width,Screen.Height)

20. GUILayout直接控制全部控件的样式,类似Js中的CSS