Update:
This function is called before rendering a frame. This is where most game behaviour code goes, except physics code.
FixedUpdate:
This function is called once every physics time step. This is the place to do physics-based game behaviour.
Code outside any function:
Code outside functions is run when the object is loaded. This can be used to initialise the state of the script.
Note: Sections of this document assume you are using Javascript, but see Writing scripts in C# & Boo for information about how to use C# or Boo scripts.
Update:这个函数在渲染帧之前被调用,大部分的游戏行为代码都在这里执行,除 物理代码。
FixedUpdate:这个函数在每进行一次物理时间步调时被调用,它是基于物理的游戏行为。
Code outside any function:这类函数在对象加载时被调用,它可以用来脚本的初始化工作。
本章我们着重讨论Update 这个函数,创建脚本与绑定脚本的方法在第二章中已经介绍过了不会的盆友请去那里阅读。虽然官方推荐脚本使用JavaScript编辑,但是其实C#更符合Unity3D的编程思想,推荐新人先使用JavaScript,然后在学习C#,因为JavaScript更容易上手一些。
在三维世界中创建两个矩形,然后在添加两个脚本分别绑定在这两个箱子上,脚本的名称暂时命名为 js0 、js1。
在Project 页面中打开刚刚创建的js0,发现Unity3D 已经将Update 函数添加在脚本中了。
模型的移动
Translate方法中的三个参数分别标示,模型在三维世界中X 、Y、Z 轴移动的单位距离。
1 2 3 4 5 6 7 8 9 10 11 12 |
function Update () { //模型x轴,移动一个单位 transform.Translate(1,0,0); //模型y轴,移动一个单位 transform.Translate(0,1,0); //模型z轴,移动一个单位 transform.Translate(0,0,1); } |
执行代码发现参数为1速度居然移动的着么快,怎么能修改移动的速度呢?
Time.deltaTime:标示上一次调用Update一秒为标示每帧执行所消耗的时间。
有了这个参数,我们就可以根据它修改方向移动的速度了。
1 2 3 4 5 6 7 8 9 10 11 |
function Update () { //设置移动的范围 var translation : float = Time.deltaTime * 10; //移动的方向 transform.Translate (translation, 0, 0); transform.Translate (0, translation, 0); transform.Translate (0, 0, translation); } |
模型的平移可以选择一个参照物,下面代码第二个参数设置模型移动参照物,这里设置成摄像机。那么模型将以相对与摄像机进行移动。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
function Update () { //设置移动范围 var translation : float = Time.deltaTime * 10; //相对于摄像机,模型向右移动。 transform.Translate(Vector3.right * translation, Camera.main.transform); // 相对于摄像机,模型向上移动。 transform.Translate(Vector3.up * translation, Camera.main.transform); // 相对于摄像机,模型向左移动。 transform.Translate(Vector3.left * translation, Camera.main.transform); } |
模型的旋转
Rotate方法中的三个参数分别标示,模型在三维世界中X 、Y、Z 轴旋转的单位距离。
1 2 3 4 5 6 7 8 9 10 11 |
function Update () { //以模型X轴旋转,单位为2. transform.Rotate(2, 0, 0); //以模型Y轴旋转,单位为2. transform.Rotate(0, 2, 0); //以模型Z轴旋转,单位为2. transform.Rotate(0, 0, 2); } |
模型的旋转可以选择一个参照物,下面代码第二个参数设置模型移动参照物,这里设置成3D世界。那么模型将以相对与整个3D世界进行旋转。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
function Update () { //设置旋转的范围 var rotate : float = Time.deltaTime * 100; //旋转的方向 //相对于世界坐标中心向右旋转物体 transform.Rotate(Vector3.right * rotate, Space.World); //相对于世界坐标中心向上旋转物体 transform.Rotate(Vector3.up * rotate, Space.World); //相对于世界坐标中心向左旋转物体 transform.Rotate(Vector3.left * rotate, Space.World); } |
如下图所示,给出一个小例子,在脚本中移动箱子的坐标,在屏幕中记录模型移动的位置,并且显示在游戏视图中。效果很不错吧,嘻嘻~~
完整代码
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 |
//X轴移动位置 var posX : float; //Y轴移动位置 var posY : float; //Z轴移动位置 var posZ : float; function Update () { //设置移动的范围 var x : float = Time.deltaTime * 10; var y : float = Time.deltaTime * 8; var z : float = Time.deltaTime * 5; //移动的方向X轴 transform.Translate (x, 0, 0); //移动的方向Y轴 transform.Translate (0, y, 0); //移动的方向Z轴 transform.Translate (0, 0, z); //赋值计算模型在三维坐标系中的位置 posX += x; posY += y; posZ += z; } function OnGUI () { //将坐标信息显示在3D屏幕中 GUI.Label(Rect(50, 100,200,20),"x pos is" + posX +"float"); GUI.Label(Rect(50, 120,200,20),"y pos is" + posY +"float"); GUI.Label(Rect(50, 140,200,20),"z pos is" + posZ +"float"); } |
Unity3D 的世界中脚本还可以做很多事情,以后我在慢慢向各位道来~ 欢迎各位盆友可以和MOMO一起讨论Unity3D游戏开发,哇咔咔~~~
- 本文固定链接: https://www.xuanyusong.com/archives/501
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
雨松大大,有个问题想请教一下,我用UNET构建了个小场景,在电脑上可以客户端可以连接到服务器,Windows和Linux都可以,发布到安卓缺连不了,这是问什么呢
呵呵,还有deltatime,一直忘记
求教一下,刚刚接触unity,在做这个练习,问一下我把“var translation : float = Time.deltaTime * 10”放在update函数之外,为什么没法实现效果?这个Time.deltaTime只能在update里使用吗?
我想问下unity3d怎么实现蓝牙的通信,就是在android之间通信
怎么解决让物体移动指定的距离呢?我只想到下面的方法。有没有更好的呢?请教了。是初學者,js寫的。var move :Vector3 ;function Start ( ) { move = gameObject.transform.position; }function Update ( ) { var speed :float =2 ;//speed移動速度 if(gameObject.transform.position.y <= move.y){transform.Translate(move.up*Time.deltaTime*speed ); } }function OnGUI( ){ if(GUILayout.Button(“up”,GUILayout.Width(50),GUILayout.Height(50))) {move.y = move.y 10; } //指定移動距離為10現在的必須滿足以下條件,否則被移動的物體會出現抖動不止問題。!!(初始位置的y值+10)必須是整數且能被speed整除!!求教有沒有更容易的方法來解決抖動問題或更精簡的語句可以節省資源。謝謝。
怎么解决让物体移动指定的距离呢?我只想到下面的方法。有没有更好的呢?请教了。是初學者,js寫的。var move :Vector3 ;function Start ( ) { move = gameObject.transform.position; }function Update ( ) { var speed :float =2 ;//speed移動速度 if(gameObject.transform.position.y <= move.y){transform.Translate(move.up*Time.deltaTime*speed ); } }function OnGUI( ){ if(GUILayout.Button(“up”,GUILayout.Width(50),GUILayout.Height(50))) {move.y = move.y 10; } //指定移動距離為10現在的必須滿足以下條件,否則被移動的物體會出現抖動不止問題。!!(初始位置的y值+10)必須是整數且能被speed整除!!求教有沒有更容易的方法來解決抖動問題或更精簡的語句可以節省資源。謝謝。
怎么解决让物体移动指定的距离呢?我只想到下面的方法。有没有更好的呢?请教了。是初學者,js寫的。var move :Vector3 ;function Start ( ) { move = gameObject.transform.position; }function Update ( ) { var speed :float =2 ;//speed移動速度 if(gameObject.transform.position.y <= move.y){ transform.Translate(move.up*Time.deltaTime*speed ); } }function OnGUI( ){ if(GUILayout.Button(“up”,GUILayout.Width(50),GUILayout.Height(50))) { move.y = move.y + 10; } //指定移動距離為10現在的必須滿足以下條件,否則被移動的物體會出現抖動不止問題。!!(初始位置的y值+10)必須是整數且能被speed整除!!求教有沒有更容易的方法來解決抖動問題或更精簡的語句可以節省資源。謝謝。
怎么解决让物体移动指定的距离呢?我只想到下面的方法。有没有更好的呢?请教了。是初學者,js寫的。var move :Vector3 ;function Start ( ) { move = gameObject.transform.position; }function Update ( ) { var speed :float =2 ;//speed移動速度 if(gameObject.transform.position.y <= move.y){ transform.Translate(move.up*Time.deltaTime*speed ); } }function OnGUI( ){ if(GUILayout.Button(“up”,GUILayout.Width(50),GUILayout.Height(50))) { move.y = move.y + 10; } //指定移動距離為10現在的必須滿足以下條件,否則被移動的物體會出現抖動不止問題。!!(初始位置的y值+10)必須是整數且能被speed整除!!求教有沒有更容易的方法來解決抖動問題或更精簡的語句可以節省資源。謝謝。
雨松你好,我也是同样的为题,不过黄金矿工里是来回旋转这个该怎么实现,另外不用GUI什么更合适,能给个代码嘛,求指教
参照物怎么理解?我做了一个测试,两个cube速度v大小相当方向相反,然后其中一个cube1已cube2为参照物,我的理解是此时cube1相对于cube2以V速度运动,cube1 相对于本地空间是静止的.但是结果不是这样子
MOMO大大,如果是加上刚体,两个物体碰撞就会发生物体的移动 如果想不移动就知识阻止碰撞怎么做呢
I?m also commenting…
I think one…
Pingback 引用通告: viagra
包装一个扩展方法来用
HDR的意思?
能不能把demo也发出来
momo老师….unity如何知道运行是平板电脑还是手机?
你好,雨松momo,我是个新手,我想请教下怎么实现人物模型的手臂来模拟真人手臂的运动?
IK动画。 或者FK动画。。。
比如我输入“右边”,人物模型打出哑语中的“右边”手势,再次输入“左边”打出对应手势,这种的用IK?目前做的东西用到的手势比较多,用动画不是很好控制把!
还是说通过动画事件,改变transform中的position或rotation值?
position或rotation 只能更改模型整体的坐标和 旋转 但是你的这个需求是模型自身发生更改, 所以最好做成动作。。
谢谢,现在用动画搞定了些简单的动作了!
你好,我是大四的学生在做关于黄金矿工的毕业设计 我遇到一个问题 看了你写的书也没法解决,就是 那个钩子怎么让它旋转绕着一个固定的点旋转起来,我是用GUI做的,2d游戏。
using UnityEngine;using System.Collections;public class NewBehaviourScript : MonoBehaviour {public Texture2D image ;public float rotSpeed =100.0f;private float rotAngle ;void Update(){ rotAngle += Time.deltaTime * rotSpeed;}void OnGUI(){ Matrix4x4 _matrix = GUI.matrix; GUIUtility.RotateAroundPivot (rotAngle, new Vector2(100,100)); GUI.DrawTexture (new Rect(50 , 50 , 100 , 100),image,ScaleMode.StretchToFill); GUI.matrix = _matrix;}}用这段代码就可以旋转你的贴图了。不果我还是不建议你用GUI来做, 因为效率不好。。
using UnityEngine;using System.Collections;public class NewBehaviourScript : MonoBehaviour {public Texture2D image ;public float rotSpeed =100.0f;private float rotAngle ;void Update(){ rotAngle = Time.deltaTime * rotSpeed;}void OnGUI(){ Matrix4x4 _matrix = GUI.matrix; GUIUtility.RotateAroundPivot (rotAngle, new Vector2(100,100)); GUI.DrawTexture (new Rect(50 , 50 , 100 , 100),image,ScaleMode.StretchToFill); GUI.matrix = _matrix;}}用这段代码就可以旋转你的贴图了。不果我还是不建议你用GUI来做, 因为效率不好。。
真心感觉 U3D里的 JS 是醉垃圾的设计,没有之一。有C# 就够了,偏偏要搞这种既不是JS又不是C#的独创语法!真是….. 唉
我一般也就是用C# 蛤蛤
是通过硬件与U3D传输吗?IOS还是ANDROID
都不是,是另外一个NI的usb raw设备,不知道在unity3D里面可以实现不
中间数据交互可以通过蓝牙来传递,,,
你好,雨松,我是个新手,因为最近需要去做一个小的unity游戏,才开始学习了,买了本你写的书,才开始看,也有很多东西不懂,关于游戏的输入问题想请教下,现在时通过一个外部的光学检测设备来作为游戏输入(主要就是控制人物的行动方向速度),这个怎么处理呀,
雨松,U3D里面能不能控制摄像机的自动曝光?就是遇到较为亮的场景时能变得暗一点,遇到暗的场景时能变得亮一点。
你可以 在场景里面修改灯光的强度。。
不是这个意思哈,比如你在场景中漫游,遇到光强的地方,比如看太阳的时候,会自动变暗,在看黑暗的地方会自动变亮。
变暗的时候应该是建筑把世界光挡住了。
不是,我是想实现这样的效果,这个效果叫自动曝光。遇到这个问题。
怎么样让一个模型围绕着另个模型旋转呢?既不是以自身也不是以世界为参照物
围绕旋转,transform.RotateAround (Vector3.zero, Vector3.up, 20 * Time.deltaTime);参数1 表示 围绕旋转的参照模型的坐标参数2表示一次旋转的速度。
雨松,有个问题请教你,在C#中像这样的语句transform.position.x=x是通不过编译的,只能使用transform.position = new Vector3(xxx,xxx,xxx);来写,而js中可以使用前一种复制方法,在C#中每次用一次position都要使用一次new,这样太麻烦啊,有方法解决吗?
这个没办法的。