接着上一节,我们做了子弹的触发器和刚体,目的是为了与其他道具做交互,既然要交互,肯定少不了代码,我们在Bullet脚本下加一个空白的发生交互的方法留作备用:
private void OnTriggerEnter2D(Collider2D collision){
}
下一步就是给各个物体加上自身的标签,好让我们的代码识别:
我们需要添加的标签有:
添加完标签之后,记得为每个预制体附上相应的标签,例如:
代码如下:
private void OnTriggerEnter2D(Collider2D collision){
switch (collision.tag) {
case "Eagle":
break;
case "Tank":
break;
case "Enemy":
break;
case "Wall":
break;
case "Barrir":
break;
default:
break;
}
}
现在我们来写玩家死亡的方法(写在Player脚本之下):分两个部分,产生爆炸效果、销毁坦克!
public GameObject explosionPrefab;
// Tank's Die
private void Die(){
//Producing explosive effects
Instantiate(explosionPrefab,transform.position,transform.rotation);
//tank die
Destroy(gameObject);
}
代码编译之后,我们把爆炸效果的动画赋给Player的预制体:
但是我们不能让我们的爆炸效果一直持续下去,所以我们要给爆炸效果添加一个脚本,用来控制播放次数!
我们打开这个脚本,在start方法里面编写,播放一遍销毁这个动画效果!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Explosion : MonoBehaviour {
// Use this for initialization
void Start () {
//destroy expliosion keep 1s
Destroy (gameObject, 1f);
}
// Update is called once per frame
void Update () {
}
}
然后在刚刚的switch的Tank case之后加上这句话:
collision.SendMessage ("Die");
传送Die方法,产生爆炸效果!
接下来我们写玩家无敌方法,在player脚本之下:
private float defendTimeVal=3; // defended time
private bool isDefended=true; //if player is defended, no die
// Update is called once per frame
void Update () {
//defended
if(isDefended){
defendTimeVal -= Time.deltaTime;
if (defendTimeVal <= 0)
isDefended = false;
}
}
//Tank die
private void Die(){
//if player is defended , we will not go the next function
if (isDefended)
return;
//Producing explosive effects
Instantiate(explosionPrefab,transform.position,transform.rotation);
//tank die
Destroy(gameObject);
}
预定义两个变量、一个是浮点类型值,表示受保护状态仅有3秒,一个是布尔类型值,表示玩家是否处于被保护状态!
然后在Update方法下调用,如果处于保护状态,那么时间-=Time.deltatime,如果时间小于等于0了,那么保护状态切换为false。如果在保护状态,玩家不幸中枪,那么直接return,不执行后两句语句!
我们的程序是很友好的,如果玩家处于被保护状态,我们应该给玩家一点提示。我们首先让物体Shield附加给物体Player
效果是这样的:
那么这时候,我们要在player脚本里面加上
public GameObject defendedEffectPrefab;
把Shield预制体加在Player上:
并且,在Update方法下加上:(关闭或者开启特效的开关)
// Update is called once per frame
void Update () {
//defended
if(isDefended){
//shield effect
defendedEffectPrefab.SetActive (true);
defendTimeVal -= Time.deltaTime;
if (defendTimeVal <= 0) {
isDefended = false;
defendedEffectPrefab.SetActive (false);
}
}
}
然后我们要的效果就实现了!
转载请注明出处!