【Unity 3d + C#】2d游戏坦克大战开发详解(四)

四、玩家无敌方法和死亡方法

接着上一节,我们做了子弹的触发器和刚体,目的是为了与其他道具做交互,既然要交互,肯定少不了代码,我们在Bullet脚本下加一个空白的发生交互的方法留作备用:

private void OnTriggerEnter2D(Collider2D collision){
	
}

下一步就是给各个物体加上自身的标签,好让我们的代码识别:

我们需要添加的标签有:

 

添加完标签之后,记得为每个预制体附上相应的标签,例如:

  • Eagle:当子弹碰到“家”的时候,游戏结束的标志;
  • Tank:当子弹碰到坦克时,自己死亡;
  • Enemy:当子弹打到敌人身上,敌人死亡;
  • Wall:当子弹打到可以被摧毁的墙上,墙体摧毁,子弹消失;
  • Barrir:子弹打到障碍物上……子弹消失……

代码如下:

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);
		}
				
	}
}

然后我们要的效果就实现了!


转载请注明出处!

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值