(1)发射子弹及相关脚本
小源之前实现了视角的简单操控,下面来创建一个球体当作子弹,并把这个球体变成预制体。
然后把界面中的球体Delete,等到用到的时候再出现。既然要这个球体作为子弹,那么肯定是要在点击鼠标左键时发射出去
我们可以添加进之前写的漫manyou.cs脚本中。
在这个脚本的类里,函数外添加变量:
public Transform Q;
在这个脚本的update函数末尾继续添加代码:
if (Input.GetButtonDown ("Fire1")) {
Transform n = (Transform)Instantiate(Q,transform.position,transform.rotation) as Transform;
Vector3 fwd = transform.TransformDirection(Vector3.forward);
n.GetComponent<Rigidbody>().AddForce(fwd * 3000);
Destroy(n.gameObject, 3);
Instantiate是实例化函数,就是将预制体实例化。三个函数分别是,对象,方向,旋转角度。
transform.position,transform.rotation分别代表了摄像机的位置和旋转角度。
Transform是一个封装好的类,public Transform Q定义了一个Transform类的对象。
Vector3是三维世界的坐标相关的类,此处是为了确定发射的方向。
GetComponent<Rigidbody>().AddForce();是给物体添加一个力。这里注意在U3D4.X版本中,是Rigidbody.AddForce();不同版本的函数略有不同。
Destroy是销毁。不然创建一个子弹一直不销毁,子弹会越来越多,会影响程序的运行。第二个参数是几秒后销毁。
在Main Camera下的manyou脚本下可以看到出现了Q,这里拖拽预制体中的zidan,或点击Q后的小圆圈添加物体,将zidan添加给Q。
这样就实现了子弹的发射和销毁
(2)Text的使用及相关脚本
想要在游戏中写一些文字,就需要Text控件了
如果是4.X版本的话,应该Hierarchy中点击Create->GUI->Text
如果是5.X版本的话,应该是Create->UI->Text
小源是5.X版本的,创建以后会出现下面几个东东
点击Text,查看它的属性设置等等
上面的xyz不再是在世界中的坐标,而是相对于整个界面的位置。
下面的Text中可以修改显示的文字,小源想显示发射了多少个子弹
那么问题来了,发射子弹数是一个变量,怎么在Text中显示变量呢
这就需要脚本来实现了。
由于发射数是和鼠标左键点击有关,而鼠标左键点击的代码是在manyou脚本中
所以依然在manyou脚本中if (Input.GetButtonDown ("Fire1"))下写
首先也是定义一个新变量number,使number=0,在if (Input.GetButtonDown ("Fire1"))末尾添加number++,意思是每点击一下左键,number+1,然后添加
GameObject.Find("Canvas/Text").GetComponent<Text>().text = "发射数:" + number ;
需要注意的是,5.X版本需要添加一个包,即
using UnityEngine.UI;
低版本的有所不同,大家可以上网搜索低版本的写法。
在这里先Find,寻找Canvas/Text这个控件,再修改text属性。保存运行后就可以动态显示发射数了。
除了寻找控件以外,还可以寻找脚本。
比如在Cube上有一个脚本,需要用到manyou脚本中的number数据,怎么做呢
int zd = GameObject.Find("Main Camera").GetComponent<manyou>().number;
这是寻找到manyou脚本下的number变量,就可以用zd来表示manyou脚本中的number变量了
说到这里,脚本中可以控制其他脚本的开关,如下
GameObject.Find("Main Camera").GetComponent<manyou>().enabled = false;
enabled=false就意味着把manyou脚本关闭了,如果等于true,即为打开。
在程序中可以根据需要,某些条件下关闭某些脚本。
(3)cube预制体脚本
现在我写了一个cube相关脚本来实现一些功能,相信有了上面的讲解大家可以很容易地知道这个脚本的作用。
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class number: MonoBehaviour {
public int zd;
public int xm;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (gameObject.transform.position.y < 0)
{
zd = GameObject.Find("Main Camera").GetComponent<manyou>().number;
xm = GameObject.Find("Main Camera").GetComponent<manyou>().number1++;
GameObject.Find("Canvas/Text").GetComponent<Text>().text = "发射数:" + zd + " " + nu;
if (nu >= 20)
{
GameObject.Find("Canvas/Text").GetComponent<Text>().text = "恭喜过关!" ;
GameObject.Find("Main Camera").GetComponent<manyou>().enabled = false;
}
Destroy(gameObject);
}
}
}
把这个脚本添加给预制体cube,此时gameObject就是这个cube了
这个脚本是如果cube的y坐标小于0,也就是被打下了地面,就会被销毁,number1++
number1和number一样定义在manyou脚本中,用来计算被消灭的cube数