Unity3D 学习笔记(二)脚本的使用
来源:互联网 发布:vb宽度高度 编辑:程序博客网 时间:2024/06/11 21:54
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();即可,免去了寻找对象这一操作。
常用属性
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 学习笔记(二)脚本的使用
- XLT的unity3D学习笔记(二)
- 【Unity3d学习之二】使用内置MonoDevelop进行Unity3D的脚本调试
- unity3d 学习笔记(二)
- Unity3D学习笔记之脚本的生命周期
- Unity3D学习笔记(十五)脚本:HelloWorld!
- Unity3D学习笔记(二):C#学习
- Unity3D学习笔记(二)Unity的JavaScript基础
- unity3D脚本学习笔记1
- unity3d脚本学习笔记2
- Unity3D脚本学习笔记3
- Unity3D 学习笔记(二) GUI
- unity3d 学习笔记(二) 创建地形
- Unity3D学习入门笔记(二)
- 【Unity3D游戏开发学习笔记】(二)Unity3D编辑器总览
- Unity3D之Mecanim动画系统学习笔记(六):使用脚本控制动画
- Unity3d C# 脚本学习小结(二) 【常用方法】
- Unity3D学习笔记-编写脚本常常出现的错误
- 使用Nose模块,出现了Traceback,SystemExit: False.
- C#.NET学习心得(二)
- git上的错误
- C++——NOIP模拟题——减法
- 冒泡排序
- Unity3D 学习笔记(二)脚本的使用
- linux设置开机服务自动启动/关闭自动启动命令
- 程序员,如何从平庸走向理想?
- update left join 多表关联更新,
- Inno setup 安装、卸载检测进程运行情况
- nyoj 1185 最大最小值 (线段树)
- android接私活的网址
- vim or sed字符串批量替换
- 【CSS】2.css&html