unity学习笔记

2023-12-24 06:00:22

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

文章来源:https://blog.csdn.net/2301_79022588/article/details/135169219
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。