Unity3D 学习笔记(二)脚本的使用
2017-04-15 16:53
302 查看
u3d内置的脚本包括C#,类javascript和类python。对于经常写GUI的人来说,写游戏脚本的API看起来还是比较亲切的,一系列回调名和web前端比较接近。像我这样长期使用远古时代opengl写游戏逻辑的人,完全可以无缝对接到unity3D的使用。
脚本可以在项目窗口右键新建一个,双击开始编辑,一些要包含的东西都自动生成了。然后直接拖拽到特定物体上运行。
函数的使用可以直接在官网文档查询:点这里
如何调用别的脚本里的函数/变量呢?当然如果这个函数/变量是静态的,我们就可以直接调用了,除此之外,我们主要使用Find来找到我们想要的对象(以下functionName可替换成VariableName):
(1) GameObject.Find('ObjectName').GetComponent<'scriptName'>().functionName();
(2)GameObject.Find('ObjectName').SendMessage('functionName');
当然,如果是作用于同一物体的不同脚本,那么只需要:
GetComponent<'scriptName'>().functionName();即可,免去了寻找对象这一操作。
transform.localPosition:物体的物体坐标
transform.position:物体的世界坐标
transform.localScale:物体的大小比例
Time.deltaTime:两帧之间时间间隔
Awake :初始化,一开始(脚本实例化时)执行。
Start : 在Awake之后执行,第一次Update之前执行,用于准备工作。
Update :每一帧执行,它一般而言并不是稳定的,因为每次绘制耗时都不同。也就是我们常说的游戏的FPS。
FixedUpdate :固定时间执行,在做一些动画效果计算时需要精确的时间间隔,比如要考虑时间的物理仿真计算,如果在opengl中这个还需要自己手动写一个特定时间间隔执行的控制器,嵌入到update中,在u3d中就方便多了。
LateUpdate:所有Update之后调用。那为什么不直接写在Update之后呢,因为场景中有很多脚本,它们都要执行一边update,这个LateUpdate就是等它们都执行完了才去做。经常写异步语言的人都知道,在异步语言中做同步控制是很重要的,也就是保证多个事件执行的拓扑顺序,这个LateUpdate就有种同步控制的意思。
Reset:点击reset按钮时调用。
关于LateUpdate,Unity官网给了一个相机的例子,也就是要在所有物体都Update之后才移动相机,保证画面上物体都已显示。
OnMouseOver :鼠标位于物体之上时调用。
OnMouseEnter:鼠标进入物体时调用。
OnMouseExit:鼠标离开物体时调用。
OnMouseUp:鼠标抬起时调用.
OnMouseDown :鼠标在物体上按下时调用。
OnMouseDrag:鼠标拖动物体时调用。
Unity官网给出的关于OnMouseOver和OnMouseEnter的例子:
将鼠标放在物体上,物体会变成红色,然后随着鼠标停留在物体上,红色慢慢变慢,离开后变成白色。
OnApplicationFocus:应用程序失去焦点时调用。经常写GUI的人应该很清楚焦点是个什么东西,在桌面平台上就是当你点击了某个窗口,窗口处在顶层且呈现激活态时。对于一些游戏,可以利用这个函数在玩家不再聚焦于游戏窗口时,暂停一些功能。
OnApplicationPause:应用程序暂停时调用。这个可以联想一下安卓开发,也有类似的几个API,当你离开游戏进入别的界面时,游戏虽然没有关闭,但是已经不是当前栈顶的项目了,如果你重新回到游戏界面,但是你的应用程序没有做状态保存(存档)操作的话,那么界面将会到初始化的状态。
OnApplicationQuit:应用程序退出时调用,这个应该不用多说了。
Unity官网样例:当程序暂停或失去焦点时,显示游戏暂停。
OnGUI : 绘制游戏界面时调用,也是比较常用的了,GUI这部分也有很多可以研究的,前面的例子正好就使用了GUI来画一个标签。
OnCollistionEnter:两个碰撞体/刚体开始重叠时调用。
OnCollisionExit :两个碰撞体/刚体不再重叠时调用。
OnCollisionStay:两个碰撞体/刚体保持重叠状态时调用(每帧)。
OnParticleCollision:粒子碰到碰撞体时调用。
OnTriggerEnter:碰撞体进入触发区域时调用。
OnTriggerExit:碰撞体离开触发区域时调用。
OnTriggerStay:碰撞体停留在触发区域时调用(每帧)。
(同时有2D版本的,直接在后面加上2D作为函数名即可)
Unity官网样例:碰撞后绘制接触点和法线,相对速度达到一定值播放声音。
OnBecomeInvisible:物体不被摄像机显示时调用。
OnBecomeVisible:物体被摄像机显示时调用。
OnPreRender:作用于摄像机,范围内开始渲染时调用。
OnPostRender:作用于摄像机,范围内渲染完成后调用。
OnPreCull:作用于摄像机,剔除场景后调用。
以下是部分网络模块:
OnConnectedToServer:连接到服务器时调用。
OnDisconnectedFromServer:从服务器断开时调用。
OnFailedToConnect / OnFailedToConnectToMasterServer:连接失败时调用。
OnPlayerConnected:玩家成功连接服务器调用。
OnPlayerDisConnected:玩家掉线时调用。
Unity官网的例子,也就是打印一下连线的玩家:
脚本可以在项目窗口右键新建一个,双击开始编辑,一些要包含的东西都自动生成了。然后直接拖拽到特定物体上运行。
函数的使用可以直接在官网文档查询:点这里
作用域
一个脚本可以作用于多个物体,一个物体也可以有多个脚本,所以在一个游戏中大量物体和大量脚本的时候,首要的任务是了解怎样引入一个变量,以及变量的作用域。如何调用别的脚本里的函数/变量呢?当然如果这个函数/变量是静态的,我们就可以直接调用了,除此之外,我们主要使用Find来找到我们想要的对象(以下functionName可替换成VariableName):
(1) GameObject.Find('ObjectName').GetComponent<'scriptName'>().functionName();
(2)GameObject.Find('ObjectName').SendMessage('functionName');
当然,如果是作用于同一物体的不同脚本,那么只需要:
GetComponent<'scriptName'>().functionName();即可,免去了寻找对象这一操作。
常用属性
render.material.color:物体的颜色transform.localPosition:物体的物体坐标
transform.position:物体的世界坐标
transform.localScale:物体的大小比例
Time.deltaTime:两帧之间时间间隔
事件响应函数
Unity中函数基本是大写开头的,以下仅介绍部分API,其余可以在unity官网查找。Awake :初始化,一开始(脚本实例化时)执行。
Start : 在Awake之后执行,第一次Update之前执行,用于准备工作。
Update :每一帧执行,它一般而言并不是稳定的,因为每次绘制耗时都不同。也就是我们常说的游戏的FPS。
FixedUpdate :固定时间执行,在做一些动画效果计算时需要精确的时间间隔,比如要考虑时间的物理仿真计算,如果在opengl中这个还需要自己手动写一个特定时间间隔执行的控制器,嵌入到update中,在u3d中就方便多了。
LateUpdate:所有Update之后调用。那为什么不直接写在Update之后呢,因为场景中有很多脚本,它们都要执行一边update,这个LateUpdate就是等它们都执行完了才去做。经常写异步语言的人都知道,在异步语言中做同步控制是很重要的,也就是保证多个事件执行的拓扑顺序,这个LateUpdate就有种同步控制的意思。
Reset:点击reset按钮时调用。
关于LateUpdate,Unity官网给了一个相机的例子,也就是要在所有物体都Update之后才移动相机,保证画面上物体都已显示。
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void LateUpdate() { transform.Translate(0, Time.deltaTime, 0); } }
OnMouseOver :鼠标位于物体之上时调用。
OnMouseEnter:鼠标进入物体时调用。
OnMouseExit:鼠标离开物体时调用。
OnMouseUp:鼠标抬起时调用.
OnMouseDown :鼠标在物体上按下时调用。
OnMouseDrag:鼠标拖动物体时调用。
Unity官网给出的关于OnMouseOver和OnMouseEnter的例子:
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { public Renderer rend; void Start() { rend = GetComponent<Renderer>(); } void OnMouseEnter() { rend.material.color = Color.red; } void OnMouseOver() { rend.material.color -= new Color(0.1F, 0, 0) * Time.deltaTime; } void OnMouseExit() { rend.material.color = Color.white; } }
将鼠标放在物体上,物体会变成红色,然后随着鼠标停留在物体上,红色慢慢变慢,离开后变成白色。
OnApplicationFocus:应用程序失去焦点时调用。经常写GUI的人应该很清楚焦点是个什么东西,在桌面平台上就是当你点击了某个窗口,窗口处在顶层且呈现激活态时。对于一些游戏,可以利用这个函数在玩家不再聚焦于游戏窗口时,暂停一些功能。
OnApplicationPause:应用程序暂停时调用。这个可以联想一下安卓开发,也有类似的几个API,当你离开游戏进入别的界面时,游戏虽然没有关闭,但是已经不是当前栈顶的项目了,如果你重新回到游戏界面,但是你的应用程序没有做状态保存(存档)操作的话,那么界面将会到初始化的状态。
OnApplicationQuit:应用程序退出时调用,这个应该不用多说了。
Unity官网样例:当程序暂停或失去焦点时,显示游戏暂停。
using UnityEngine; public class AppPaused : MonoBehaviour { bool isPaused = false; void OnGUI() { if (isPaused) GUI.Label(new Rect(100, 100, 50, 30), "Game paused"); } void OnApplicationFocus(bool hasFocus) { isPaused = !hasFocus; } void OnApplicationPause(bool pauseStatus) { isPaused = pauseStatus; } }
OnGUI : 绘制游戏界面时调用,也是比较常用的了,GUI这部分也有很多可以研究的,前面的例子正好就使用了GUI来画一个标签。
OnCollistionEnter:两个碰撞体/刚体开始重叠时调用。
OnCollisionExit :两个碰撞体/刚体不再重叠时调用。
OnCollisionStay:两个碰撞体/刚体保持重叠状态时调用(每帧)。
OnParticleCollision:粒子碰到碰撞体时调用。
OnTriggerEnter:碰撞体进入触发区域时调用。
OnTriggerExit:碰撞体离开触发区域时调用。
OnTriggerStay:碰撞体停留在触发区域时调用(每帧)。
(同时有2D版本的,直接在后面加上2D作为函数名即可)
Unity官网样例:碰撞后绘制接触点和法线,相对速度达到一定值播放声音。
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { AudioSource audio; void Start() { audio = GetComponent<AudioSource>(); } void OnCollisionEnter(Collision collision) { foreach (ContactPoint contact in collision.contacts) { Debug.DrawRay(contact.point, contact.normal, Color.white); } if (collision.relativeVelocity.magnitude > 2) audio.Play(); } }
OnBecomeInvisible:物体不被摄像机显示时调用。
OnBecomeVisible:物体被摄像机显示时调用。
OnPreRender:作用于摄像机,范围内开始渲染时调用。
OnPostRender:作用于摄像机,范围内渲染完成后调用。
OnPreCull:作用于摄像机,剔除场景后调用。
以下是部分网络模块:
OnConnectedToServer:连接到服务器时调用。
OnDisconnectedFromServer:从服务器断开时调用。
OnFailedToConnect / OnFailedToConnectToMasterServer:连接失败时调用。
OnPlayerConnected:玩家成功连接服务器调用。
OnPlayerDisConnected:玩家掉线时调用。
Unity官网的例子,也就是打印一下连线的玩家:
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { private int playerCount = 0; void OnPlayerConnected(NetworkPlayer player) { Debug.Log("Player " + playerCount + " connected from " + player.ipAddress + ":" + player.port); } }
相关文章推荐
- Unity3D之Mecanim动画系统学习笔记(六):使用脚本控制动画
- Unity3D之Mecanim动画系统学习笔记(六):使用脚本控制动画
- Unity3D之Mecanim动画系统学习笔记(六):使用脚本控制动画
- Unity3D之Mecanim动画系统学习笔记(六):使用脚本控制动画
- unity3d 学习笔记_____Native2d 刚体、碰撞器、关节的使用
- 【学习笔记】【Cocos2d-x Lua脚本开发】如何使用Lua脚本调用自定义类
- unity3d脚本学习笔记2
- 6. Python脚本学习实战笔记六 使用CGI远程编辑
- Unity3d C#脚本学习小结(八)[Mesh Collider的使用]
- unity3D-游戏/AR/VR在线就业班 C#入门使用字符串学习笔记
- selenium 学习笔记 ---新手学习记录(4) 问题总结(java)-autoit3脚本使用
- QNX学习笔记-使用脚本编译qnx代码,不用IDE也能编译代码
- unity3d中的Mathf.SmoothDamp函数的使用学习笔记!!
- 学习笔记之 链接器脚本的简单使用
- lua学习笔记 3 android调用Lua。Lua脚本使用LoadLib回调Java,并传多个参数
- Liunx 命令行与shell脚本编程大全 第五章学习笔记(Vim 编辑器使用详解 解释+图示)
- lua学习笔记 3 android调用Lua。Lua脚本使用LoadLib回调Java,并传多个参数
- Selenium学习笔记之004:使用Selenium IDE录制脚本并分析unittest框架
- 【学习笔记】对Badboy脚本使用MySQL中的数据进行参数化
- 大数据学习笔记:编写脚本分发配置,数据分布,以及使用代码打印调试信息