Unity3D 脚本及变量 -- 基本概念

1. 简介

    在Unity中,脚本是实现游戏功能的主要方式之一,而变量是脚本中的重要元素,通过变量的使用,可以完成数据的引用,数学模型的定义及完成各种计算等。

    • 主要支持以下三种脚本:

    1)JavaScript

    2)C#

    3)Boo Script

    前两种较常用。

    • 脚本:本质上也是一种资源,所以在项目视窗中创建。

    • 在使用脚本时,需要把脚本链接到一个物体中

    • 可通过变量的使用来提高脚本的重用性


2. 访问游戏物体组件

2.1 访问游戏物体成员组件(标准的成员组件)

    •  游戏对象成员组件的访问:是指在脚本中对自身成员组件变量的访问,可通过成员变量的方式进行直接访问。

        举例如下:

        1)transform:引用Transform组件,与gameObject.transfrom、this.gameObject.transform、this.transform相同,this表示当前脚本,gameObject表示当前脚本链接的物体

        2)rigidbody:引用刚体组件

        3)...

2.2 访问自定义的组件(如脚本)

    •  如在ScriptA中需要访问ScriptB,需在ScriptA中定义一个新的变量(ScriptB),然后使用组件获取语句GetComponent来获取ScriptB,举例如下:

      ScriptB.js

#pragma strict
public var speed = 5.0;
function Start () {

}

function Update () {

}

     ScriptA.js

#pragma strict
var other:ScriptB;
function Start () {
	other = GetComponent(ScriptB); //仅引用脚本名即可
	Debug.Log(other.speed);
}

function Update () {
	transform.Rotate(0,other.speed*Time.deltaTime,0);
}

3. 游戏物体间相互访问

    • 创建游戏的过程,就是定义游戏物体与环境之间,以及游戏物体间相互交互的过程。

    • 一个游戏物体可访问其它游戏物体,或访问其它游戏物体的标准成员组件或脚本。

3.1 使用Transform公共变量直接引用物体

    在一个脚本中通过定义Transform公共变量,然后把其它物体拖到此公共变量,从而实现对此物体的引用。

    在Cube中访问Sphere的例子如下:

      SphereScript.js

#pragma strict
public var radius = 6.0;
function Start () {

}

function Update () {
	Debug.Log("Hello");
}

     CubeScript.js

#pragma strict
public var target:Transform; //引用Cube物体
function Start () {

}

function Update () {
	target.renderer.material.color = Color.red;
}


3.2 引用其它物体的脚本

       除了直接引用物体类型,用户也可以通过定义变量的方式来引用或访问其它物体中的脚本。

         SphereScript.js

#pragma strict
public var radius = 6.0;
function Start () {

}

function Update () {

}

function DoSomething(){
	Debug.Log("Hello");
}

   CubeScript.js

#pragma strict
public var target:SphereScript;
function Start () {
	target.DoSomething();
}

function Update () {
	target.renderer.material.color = Color.red;
}

     直接把SphereScript.js链接的物体拖到变量targer即可(因为球体对象中包含了SphereScript脚本)。

3.3 使用Find()函数引用物体(根据物体名称或路径)

    • 通过GameObject.Find()函数来访问其它物体,通过使用物体的名称、或路径来查找或定位场景中的其它物体。

    • 对于Find函数,尽量放在Start函数中,避免在每一帧中都对其进行执行, 以提高程序的运行效率。  

      SphereScript.js

#pragma strict
public var radius = 6.0;
function Start () {

}

function Update () {

}

function DoSomething(){
	Debug.Log("Hello");
}

     CubeScript.js

#pragma strict
public var target:GameObject; //也可以不要Find,直接把物体拖到这儿
var other:SphereScript;
function Start () {
	target = GameObject.Find("MySphere");
	other = target.GetComponent(SphereScript);  //根据组件名获取物体的组件
	other.DoSomething();
}

function Update () {
	target.renderer.material.color = Color.red;
}

3.4 使用标签的方式引用物体(根据物体标签名)

       SphereScript.js

#pragma strict
public var radius = 6.0;
function Start () {

}

function Update () {

}

function DoSomething(){
	Debug.Log("Hello");
}

     CubeScript.js

#pragma strict
public var target:GameObject;
var other:SphereScript;
function Start () {
	//target = GameObject.Find("MySphere");
	target = GameObject.FindGameObjectWithTag("SphereTag");
	other = target.GetComponent(SphereScript);
	other.DoSomething();
}

function Update () {
	target.renderer.material.color = Color.red;
}

4. 脚本时间控制

4.1 Time.deltaTime

       以秒计算,完成最后一帧的时间(只读)。

4.2 Time.time

       从游戏开始到到现在所用的时间(只读)。 

4.3 Time.frameCount

       已经显示的总的帧数

4.4 Time.timeScale

       时间在以此比例流逝,可用于减慢运动效果。

4.5 时间控制Yield

       • Yield:是一种特殊类型的返回语句(即中断指令),其后的指令执行完之后,再接着向下执行。Yield指令常与WaitForSeconds,WaitForFixedUpdate,Coroutine,MonoBehaviour.StartCoroutine配合使用。     

#pragma strict
//yield.js
function Start () {
	Do();
	print("This is printed immediately, Time=" + Time.time);
}

function Update () {

}

function Do(){
	print("Do Now, Time=" + Time.time );
	yield WaitForSeconds(10); // 等待10秒之后,再执行后面的语句,即中断处理
	print("Do 10 seconds later, Time=" + Time.time);
	
}


     其执行结果如下所示:
Do Now, Time=0
UnityEngine.MonoBehaviour:print(Object)
This is printed immediately, Time=0
UnityEngine.MonoBehaviour:print(Object)
Do 10 seconds later, Time=10.00013
UnityEngine.MonoBehaviour:print(Object)

5. 随机数(Random)

    该类用于产生随机数据。

5.1 Class Variables类变量

  • Sets the seed for the random number generator.
    设置用于随机数生成器的种子。
  • Returns a random number between 0.0 [inclusive] and 1.0 [inclusive] (Read Only).
    返回一个随机数,在0.0(包括)~1.0(包括)之间。(只读)
  • Returns a random point inside a sphere with radius 1 (Read Only).
    返回半径为1的球体内的一个随机点。(只读)
  • Returns a random point inside a circle with radius 1 (Read Only).
    返回半径为1的圆内的一个随机点。(只读)
  • Returns a random point on the surface of a sphere with radius 1 (Read Only).
    返回半径为1的球体在表面上的一个随机点。(只读)
  • Returns a random rotation (Read Only).
    返回一个随机旋转角度。(只读)

5.2 Class Functions类函数

  • Returns a random  
         返回一个随机浮点数,在min(包含)和max(包含)之间。(只读)

#pragma strict

function Start () {
	var a:float;
	var b:int;
	var c:float;
	
	a = Random.value;
	Debug.Log("a=" + a);
	
	b = Random.Range(1,100);
	Debug.Log("[1,100) b=" + b);
	
	c = Random.Range(0.0,10.0);
	Debug.Log("[0.0,10.0] c=" + c);
}

function Update () {

}

      Random.Range产生的浮点随机数,可以包含最小最大范围,而产生的整型随机数,只包含最小范围,而不包含指定的最大范围。

6. C#脚本编写

    在Unity中,所有的脚本(JavaScript、C#和Boo Script)都继承自MonoBehaviour这个类。在JavaScript脚本中,系统自动继承MonoBehaviour这个类,而在C#和Boo脚本中,我们必须精确的声明类之间的继承关系。






 •

 








  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值