一、标签 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 重置为零防止多次改变方向。