上一章介绍了模型的旋转与平移,本章介绍一些好玩的,通过按钮来控制模型的移动与镜头的跟随,脚本参数的传递。个人觉得Unity3D 这套游戏引擎真的很棒,它可以为开发者节省时间。用更多少的脚本,可以实现更多的功能。先赞一下,哇咔咔~废话不多说了,入正题!
首先在3D世界中创建一个箱子模型,然后添加一个脚本,命名为 js0绑定到这个箱子中。在添加一个脚本,命名为js1 ,同样绑定到这个箱子上,用来实现对象的创建与调用方法参数的传递 ~
var Control; 这里声明一个控制类的对象,用来进行参数的传递,调用方法。
Getomponent(js1): 得到脚本名称为js1的对象,这里把值赋给Control,就可以使用js1脚本中的方法了,下面的代码中通过这个对象调用模型的移动方法。
Input.GetKey(KeyCode): 这个方法返回一个Bool 判断当前按键是否被按下,当然这里只能运行在PC上才可以感应按钮,因为IOS的设备上没有按键,以后我会介绍在IOS上添加游戏摇杆的功能,本章我们先学习一下PC上的基本按钮响应。
下面代码
实现按下“W”控制物体向前
实现按下“S”控制物体向后
实现按下“A”控制物体向左平移
实现按下“D”控制物体向右平移
实现按下“Q”控制物体向左旋转
实现按下“E”控制物体向右旋转
js0.js 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
//旋转移动速度 var Speed = 50; //控制对象 var Control; function Update() { //得到控制对象 Control = GetComponent(js1); //判断按键 if(Input.GetKey(KeyCode.W)) { //前进 Control.ForWard(); }else if(Input.GetKey(KeyCode.S)) { //后退 Control.Back(); } if(Input.GetKey(KeyCode.A)) { //前左 Control.GLeft(); }else if(Input.GetKey(KeyCode.D)) { //后右 Control.GRight(); } if(Input.GetKey(KeyCode.Q)) { //左旋转 Control.leftRotate(Vector3.up *Time.deltaTime * -Speed); }else if(Input.GetKey(KeyCode.E)) { //右旋转 Control.RightRotate(Vector3.up *Time.deltaTime * Speed); } } |
js1.js 代码
参数的传递可以使用obj进行传递,代码中我将旋转的角度做为参数传递到了js1.js中控制模型旋转。
Vector3 标示一个3D的向量单位,它可以标示模型的三个方向,这里根据旋转的角度与移动的向量设置它。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
//前进速度 var Speed = 50; //前进 function ForWard() { transform.Translate(Vector3.forward * Time.deltaTime *Speed); } //后退 function Back() { transform.Translate(Vector3.forward * Time.deltaTime * -Speed); } //向左 function GLeft() { transform.Translate(Vector3.right * Time.deltaTime *-Speed); } //向右 function GRight() { transform.Translate(Vector3.right * Time.deltaTime * Speed); } //传递参数 //左旋转 function leftRotate(obj) { transform.Rotate(obj); } //右旋转 function RightRotate(obj) { transform.Rotate(obj); } |
OK点击运行,通过按键我们可以正常的控制模型平移与旋转,但是现在有两个问题 1, 主摄像机不能跟随控制模型, 2 、模型可以横穿过山丘,感觉很假。下面我们解决这两个问题。
在Unity3D标准资源的脚本中系统帮我们写好了跟随脚本.如下图所示,点击Import Package – > Scripts 将系统脚本导入。
选中摄像机 点击Component – > Camera-Control – > Smoot Follow ,给主摄像机添加一个跟随脚本。
跟随脚本添加完以后,须要指定一个跟随的物体,下面红框内将跟随的物体Cube拖动进来,这里Cube就是我们上面控制的模型,那么这样,摄像机将会一直在身后跟随我们控制的模型。下面是一些跟随的参数,设置 跟随的距离 高度等等,盆友们手动的修改一下运行游戏就可以看出来变化,。
控制物体的碰撞可以使用 选中模型, Component – > Physics – > Rigidbody 设置这个模型的重力碰撞。那么这样你控制的模型就不会穿过山丘,而是感应重力碰撞。
点击运行游戏,看看效果,控制箱子行走的同时,我们可以清晰的看出旁边的树木被物理碰撞所干扰,前后,左右,旋转 完全OK .大家快试试吧。哇咔咔~~
明天开始MOMO又要开始处理一部分iPhone 的界面图形化开发,Tomorrow is another day ,加油哇咔咔~ Unity3D 的世界中脚本还可以做很多事情,以后我在慢慢向各位道来~ 欢迎各位盆友可以和MOMO一起讨论Unity3D游戏开发,哇咔咔~~~
- 本文固定链接: https://www.xuanyusong.com/archives/505
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!
Assets/scripts/NewBehaviourScript.js(13,1): BCE0044: expecting }, found ”.老大怎么啦
雨松老大,出现这个错误:Assets/Scripts/js0.js(17,20): BCE0019: ‘ForWard’ is not a member of ‘Object’.
在js1最后面粘贴//传递参数 //左旋转 function leftRotate(obj) { transform.Rotate(obj); } //右旋转 function RightRotate(obj) { transform.Rotate(obj); }
谢谢,去年刚学unity时候遇到的问题,很感谢您的回复.
JS0 出现了 ForWard’ is not a member of ‘Object’. ‘Back’ is not a member of ‘Object’. 是哪里出问题了吗?
我也出现这种问题了,怎么解决啊?
让我受益良多
在这个例子里如果物体碰到山体翻个跟头,那么设定的方向不就全反了吗?这该如何解决呢?
我也遇到这个问题啦,一翻跟头就全乱了,而且貌似这个cube很容易翻跟头呢
感谢!!!
老大,如何改成觸控
引入手机标准资源包吧。
unity3.5.6f4, 对Control的定义需要是var Control:js1,才能跑通, 不然会出现Control对象找不到对应的方法定义, 个人亲测。 文档里是这么写的:// To access public variables and functions // in another script attached to the same game object.var script : ScriptName;script = GetComponent(“ScriptName”);script.DoSomething ();
//得到脚本对象script = GetComponent(“ScriptName”);//接着调用脚本对象中的方法。。script.DoSomething ();
感谢,用的正好是这个版本,一直有错误,看到你这才解决的
老大问一下,导入的3d模型,比如人物,他是怎么识别人的正面和背面的
老大 我是个初学者 以前一直用flash3D开发 正在学习你出版的《unity3D游戏开发》 受益匪浅哈 学到了物理引擎的那一章 动态生成了plane 并赋予了MeshCollider组件 可是为什么plane的背面无法接收OnMouseEnter()鼠标事件呢?正面就可以 如何解决这个问题呢?刚才无意中勾选了Convex 居然背面也能响应鼠标事件了 真是费解 望您给解答一下 谢谢。
U3D中为了提高效率 默认所有网格模型背面都是不渲染的。。 你会发现你把plane旋转180度后压根都看不到见渲染, 不过你想看到渲染的话 可以动态的编写shader语言。。。
渲染已经解决了 在shader里添加了Cull Off!现在是背面无法响应鼠标事件 奇了怪了 按理说鼠标事件和正反面应该没有关系吧?毕竟都是mesh collider 怎么会没响应呢 不解~~~
这个时脚本加上去的。
为神马你要写js啊。。C#不是更好嘛?
JS是练手用的, 实际开发中肯定时C#
NullReferenceException: Object reference not set to an instance of an objectjs0.Update () (at Assets/js0.js:17)if(Input.GetKey(KeyCode.W)) { //前进 Control.ForWard(); //第17行 问题出现在这了 还有点不懂 为什么在js0.js中Control = GetComponent(js1); }
我现在用的是Unity3D 3.5.5 里面没有Camera-control这一选项 怎么办啊?
雨松哥,按照你的说明完成之后,为什么运行的时候总是提醒Assets/js0.js(7,17):UCE0001:’,’expected,Insert a semicolon at the end.Assets/js0.js(10,11):BCE0044:expecting:,found ‘=’.Assets/js1.js(5,18):UCE0001: ‘;’expected.Insert a semicolon at the end.Assets/js1.js(7,65):BCE0044:expecting :,found ‘ ;’
我按着你说的做的,但是为什么会这么样的错误呢“Assets/box/js0.js(10,26): BCE0005: Unknown identifier: ‘js1’.”
脚步错误了吧。 没找到js1 这个脚本是不是没放进去?
你是不是没有把script全部导入?