一、标签 Tags
标签是Unity中用于标识游戏对象的字符串。通过为游戏对象添加标签,我们可以轻松地识别和区分不同类型的对象。例如,可以将玩家、敌人、道具等不同类型的游戏对象分别赋予不同的标签。
选择对象:?选择想要添加标签的游戏对象。
Inspector视图: 在Inspector视图中,可以找到一个叫做"Tag"的下拉菜单。
选择标签: 点击下拉菜单,选择或创建一个标签,或者从现有的标签中选择一个。
示例:标签与触发器的混合使用
让子弹接触到不同的标签的物体,产生不同的效果
首先创建如下标签:
在脚本中写好触发的框架
?private void OnTriggerEnter2D(Collider2D collision)
? ? {
? ? ? ? switch (collision.tag)
? ? ? ? {
? ? ? ? ? ? case "Tank":
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case "Heart":
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case "Enemy":
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case "Wall":
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case "Barrier":
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? default:break;
? ? ? ? }
? ? }
现在为每一个标签写入不同的方法
对于Tank 标签,当子弹接触到玩家后,玩家将被销毁销毁,写一个dieTank方法。
public void dieTank()
? ? {
? ? ? ? //产生爆炸特效
? ? ? ? Instantiate(explosionPrefab, transform.position,transform.rotation);
? ? ? ? //销毁
? ? ? ? Destroy(gameObject);
? ? }
对于敌人标签,拥有敌人标签的他们相互的子弹是不能相互销毁的。
设置一个布尔值用来区分不同的子弹
public bool isPlayerBullect;
?
当子弹触碰到墙时直接销毁,自身也要销毁。
Destroy(collision.gameObject);
Destroy(gameObject);
当触碰到障碍物时直接销毁子弹。
Destroy(gameObject)
当子弹触发到Herat,将会销毁该物体,并更换销毁后的图片
public void Die()
? ? {
? ? ? ? sr.sprite = BrokenSprite;
? ? }
collision.SendMessage("Die");
最后代码:
private void OnTriggerEnter2D(Collider2D collision)
? ? {
? ? ? ? switch (collision.tag)
? ? ? ? {
? ? ? ? ? ? case "Tank":
? ? ? ? ? ? ? ? if (!isPlayerBullect)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ?collision.SendMessage("dieTank");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case "Heart":
? ? ? ? ? ? ? ? collision.SendMessage("Die");
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case "Enemy":
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case "Wall":
? ? ? ? ? ? ? ? Destroy(collision.gameObject);
? ? ? ? ? ? ? ? Destroy(gameObject);
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case "Barrier":
? ? ? ? ? ? ? ? Destroy(gameObject);
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? default:break;
? ? ? ? }
? ? }
当子弹接触到不同类型的标签时,会产生不同的效果。
二、游戏中敌人的自动逻辑
为敌人的攻击逻辑加一个时间间隔,每隔一段时间自动进行攻击。
? ? void Update()
? ? {
? ? ? ??
? ? ? ? if (time > 3f)
? ? ? ? {
? ? ? ? ? ? attack();
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? time += Time.deltaTime;
? ? ? ? }
? ? }
每三秒进行一次攻击,不到三秒就进行累加。
然后敌人的移动可以联想到玩家的移动,玩家的移动是通过键盘输入方向键来控制的,我们只需要随机获取到方向键然后再赋值即可。
首先重新定义一个计时器用于改变方向
private float timeValChangeDirection = 4;
写一个用于自动获取方向并移动的方法。
private void Move()
? ? {
? ? ? ? if (timeValChangeDirection > 4)
? ? ? ? {
? ? ? ? ? ? int num = Random.Range(0, 8);
? ? ? ? ? ? if (num >= 5)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? h = 0;
? ? ? ? ? ? ? ? v = -1;
? ? ? ? ? ? }else if (num == 4)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? h = 0;
? ? ? ? ? ? ? ? v = 1;
? ? ? ? ? ? }else if (num >= 2 && num <=3)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? h = 1;
? ? ? ? ? ? ? ? v = 0;
? ? ? ? ? ? }else if (num < 2)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? h = -1;
? ? ? ? ? ? ? ? v = 0;
? ? ? ? ? ? }
? ? ? ? ? ? timeValChangeDirection = 0;
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? timeValChangeDirection += Time.fixedDeltaTime;
? ? ? ? }
? ? ? ? transform.Translate(Vector3.right * h * moveSpeed * Time.fixedDeltaTime, Space.World);
? ? ? ? if (h < 0)
? ? ? ? {
? ? ? ? ? ? sr.sprite = tankSprite[3];
? ? ? ? }
? ? ? ? else if (h > 0)
? ? ? ? {
? ? ? ? ? ? sr.sprite = tankSprite[1];
? ? ? ? }
? ? ? ? if (h != 0)
? ? ? ? {
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? transform.Translate(Vector3.up * v * moveSpeed * Time.fixedDeltaTime, Space.World);
? ? ? ? if (v < 0)
? ? ? ? {
? ? ? ? ? ? sr.sprite = tankSprite[2];
? ? ? ? }
? ? ? ? else if (v > 0)
? ? ? ? {
? ? ? ? ? ? sr.sprite = tankSprite[0];
? ? ? ? }
? ? }
这个是每四秒获取一个随机数值,根据随机数值来获取H,v的值,通过这个值来让坦克移动,
并且每次获取方向的数值后都要将 timeValChangeDirection 重置为零防止多次改变方向。