几乎任何一款太空射击类游戏都会为玩家战机提供防护罩(shield)的功能,防护罩开启时,玩家几乎处于“无敌”状态,但是防护罩通常有一定的时间限制,而且使用次数有限。
那么使用Unity如何为《太空战机》类的游戏中的战机设计防护罩呢?
我的解决方案是:
由于敌人对玩家的伤害主要通过碰撞检测完成。而碰撞检测通过tag识别完成,因此可以添加防护罩的功能就是把玩家的tag改变成敌人无法碰撞识别的tag。
防护罩持续的时间可以用帧的计数来实现。
防护罩的开启可以由玩家点击“防护罩"按钮或者吃到防护罩的奖品来完成。下面我的实现是由玩家点击按钮来实现防护罩的功能,具体代码如下:shield.cs:
using UnityEngine;
using System.Collections;
public class shield : MonoBehaviour {
GameObject root; //根节点对象(Player即玩家战机)
GameObject shield0; //子节点对象(Player的子对象即防护罩光晕)
public float jishi=1; //每一帧增加的数目
bool showshield;
// Use this for initialization
void Start () { //寻找Player对象的子对象shields(防护罩)让其初始化时无效。
root=GameObject.Find ("Player");
shield0=root.transform.Find("shields").gameObject;
shield0.SetActive (false);
}
// Update is called once per frame
void Update () {
//transform.Find ("shield").enabled = true;
jishi += Time.deltaTime;
if (jishi > 20) { //在点击防护罩按钮后的20帧的时间段内玩家处于无敌状态。超过20帧的时间,防护罩消失。
shield0.SetActive (false);
root.tag = "Player";//此时玩家标志为Player,敌人可以识别该标志,这时敌人对玩家可以产生伤害。
jishi=1; //初始化计时基数为1.
}
}
void OnGUI(){
if (GUI.Button (new Rect (0, 500, 100, 50),""+jishi))
{ //点击防护罩按钮就会出现防护罩
shield0.SetActive (true);
jishi=1; //初始计数基数为1.
root.tag="up"; //此时玩家战机(Player)对象的标志tag设置为up,由于敌人不能识别up标志,那么敌人对玩家就没有伤害。此时玩家处于无敌状态。
}
}
}