虽然之前做了一大堆Unity3D,但对于Unity3D各个脚本中的变量操控与使用还不够灵活,至少做了这么多唯一和旋转,对于Vector还懵懵懂懂的。其实在Unity3D各个变量在同场景拿个值非常随意,连公共类都不用自己写了,直接用鼠标轻轻一点就行,下面举个例子说明这两个基础问题,打牢基础,对以后做游戏大有裨益。
在场景中,如下图,布置一个球,和一个空物体GameObject。
如果要让球上升3个位置很简单,在这球挂的脚本,就一句transform.Translate(Vector3.up*3);完事。
但现在我要在GameObject中让这个球上升3个位置的同时,将挂在这个球一个简单得不能再简单,无脑得不能再无脑的脚本中的sphere_name这个值读出来。
using UnityEngine;
using System.Collections;
public class Sphere_Script : MonoBehaviour
{
public string sphere_name = "aaa";
}
那么GameObject的剧本该怎么写呢?具体如下:
using UnityEngine;
using System.Collections;
public class Script : MonoBehaviour
{
public GameObject A;
void Start()
{
//A = GameObject.Find("Sphere");//由于在编辑器界面中指明了A是什么,这句可以省略
A.transform.Translate(0, 3, 0);//前面没有A.指的是当前被挂脚本的物体,有A.就是对A操作
//A.transform.Translate(Vector3.up * 3);//(0, 3, 0)与(Vector3.up * 3)是等同的
Sphere_Script script = A.GetComponent<Sphere_Script>();
Debug.Log(script.sphere_name);
}
}
在“Vector3.方向”的时候,例如这里方向是up,Vector3是指大小无限接近于0的三维单位方向向量。Vector2则同理指大小无限接近于0的二维单位方向向量。
而在Vector作为一个类,定义一个对象的时候,例如Vector2/3 a=XX,尤其在Vector3 a=xx.position的时候更不容易读出来Vector到底是甚。他就是指一个向量。因为在笛卡尔立体坐标,向量是指改点对原点(0,0,0)的各个方向距离描述,因此大多数情况,一个向量指代的就是改点的坐标(x,y,z),少数情况,如给物体加个速度、加个力,就是指代一个方向了。这里一点都不抽象,稍有高中数学基础的人,都能自己领悟。因此,为何上面的代码0, 3, 0)与(Vector3.up * 3)是等同的。
至于取A脚本中的变量。因为Unity3D中,脚本一旦赋予给物体之后,这个脚本就会被认为是这个物体的其中一个组件,所以只要用GetComponent先取A中的组件,然后取组件中的脚本,赋予给相应的类,一般就是脚本的名称,这里是Sphere_Script,然后直接用对象名.变量名,就能轻松访问了,当然这个变量在这个对象里面本身要是public而不是private才行!
弄好之后将这个Script赋予给空物体GameObject,然后如下图,你会发现在GameObject多了脚本这一栏是当然了,关键是脚本这一烂,多了我们刚刚自定义的public GameObject变量A,问我们这个A是什么,我们点选旁边的⊙选定这个球就完事了。这就不用GameObject.Find("某某"),我还要好好将你这个某某的名字输入一遍,你烦不烦?
具体运行效果如下,可以看到,就是我们想要的效果: