您的位置:首页 > 移动开发 > Unity3D

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();即可,免去了寻找对象这一操作。

          

        常用属性

         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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐