【Unity2D】实现玩家对敌人的攻击(代码+动画)

参考:

秦无邪OvO的个人空间_哔哩哔哩_Bilibili秦无邪OvO,独立游戏开发者/美术/编曲;秦无邪OvO的主页、动态、视频、专栏、频道、收藏、订阅等。哔哩哔哩Bilibili,你感兴趣的视频都在B站。icon-default.png?t=N7T8https://space.bilibili.com/335835274?from=search&seid=1189297610179171630&spm_id_from=333.337.0.0

【Unity2D】实现人物攻击动画以及代码展示_dangoxiba的博客-CSDN博客

【Unity2D】实现人物攻击动画以及代码展示_dangoxiba的博客-CSDN博客

有空了解我上一篇的文章


学习内容:

首先我们把画好的Enemy动画帧给导出来

(记得把背景层给关了成透明的) 

 此时我们在unity中将每一帧切割出来(我是32*32),然后把第一张作为游戏对象,把1-3作为Idle的Animation,4—6作为Attack

再为游戏对象添加一个PolycanCollider2D的组件画好区域


 代码部分:我们创建一个叫Enemy的抽象类,用来给其它Enemy调用(如伤害和血量等)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public abstract class Enemy : MonoBehaviour
{
    public int health;
    public int damage;
    public void Start()
    {
        
    }

    
    public void Update()
    {
        if(health <= 0)
        {
            Destroy(gameObject);
        }
    }
    public void TakeDamage(int damage)
    {
        health -= damage;
    }
}
并创建一个EnemyWenZi继承Enemy

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyWenZi : Enemy
{
    // Start is called before the first frame update
   public void Start()
    {
        base.Start();
    }

    // Update is called once per frame
   public void Update()
    {
        base.Update();
    }
}
同时在PlayerAttack的脚本也需要加一个碰撞检测的方法 

private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.gameObject.CompareTag("Enemy"))
        {
            other.gameObject.GetComponent<Enemy>().TakeDamage(damage);
        }
    }

学习时间:

不要忘记添加新建一个Tag叫Enemy给wenzi,然后设置好damage,health的参数


上面就完成了一个敌人并且能击杀 

学习产出:

膨胀检测private void OnTriggerEnter2D(Collider2D other)

标签检测if (other.gameObject.CompareTag("Enemy"))

继承用abstract,并将造成伤害的方法TakeDamage()公共化。

在碰撞检测里即可调用其它脚本的TakeDamge()

以下是一个简单的Unity 2D敌人追踪和攻击玩家代码示例: ```csharp public class EnemyBehavior : MonoBehaviour { public float speed = 3f; // 移动速度 public float attackRange = 1f; // 攻击范围 public float attackCooldown = 1f; // 攻击冷却时间 private Rigidbody2D rb; // 刚体组件 private GameObject player; // 玩家对象 private bool isAttacking; // 是否正在攻击 private float lastAttackTime; // 上次攻击时间 private void Start() { rb = GetComponent<Rigidbody2D>(); player = GameObject.FindGameObjectWithTag("Player"); // 通过标签查找玩家对象 } private void Update() { if (player != null) // 如果玩家对象存在 { // 计算与玩家之间的距离 float distance = Vector2.Distance(transform.position, player.transform.position); if (distance <= attackRange && !isAttacking && Time.time > lastAttackTime + attackCooldown) { // 如果距离小于等于攻击范围,且不在攻击状态且攻击冷却时间已过,则进行攻击 Attack(); } else if (distance > attackRange) { // 如果距离大于攻击范围,则追踪玩家 Vector2 direction = (player.transform.position - transform.position).normalized; rb.velocity = direction * speed; } else { // 在攻击范围内,停止移动 rb.velocity = Vector2.zero; } } } // 攻击方法 private void Attack() { isAttacking = true; // TODO: 攻击动画、音效等操作 player.GetComponent<PlayerHealth>().TakeDamage(); // 对玩家造成伤害 lastAttackTime = Time.time; Invoke("EndAttack", attackCooldown); // 在攻击冷却时间后结束攻击状态 } // 结束攻击状态 private void EndAttack() { isAttacking = false; } } ``` 该脚本需要添加到代表敌人的游戏对象上,并且需要设置玩家对象的标签为"Player"。当敌人发现玩家并且距离小于等于攻击范围时,会进行攻击操作,否则会追踪玩家。在攻击时,会对玩家造成伤害,并在攻击冷却时间后结束攻击状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值