Lógica de batalha do herói da unidade

Primeiro, bloqueie o inimigo através do script de combate do herói.
Ao bloquear o inimigo, mova-o através do script de movimento.
Quando o alcance do ataque é alcançado, a lógica de ataque é acionada.
O valor do jogador é subtraído da
saúde do inimigo. Quando o inimigo tiver sem saúde, o inimigo é destruído. A animação de ataque do jogador
inimigo é iniciada . A animação de ataque é desativada.
Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

batalha de herói

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

public class HeroCombat : MonoBehaviour
{
    
       // 英雄战斗方式
    public enum HeroAttackType {
    
     Melee,RanGed};
    public HeroAttackType heroAttackType;

    // 锁定敌人 攻击范围
    public GameObject targetedEnemy;
    public float attackRange;
    //public float rotateSpeedForAttack;
    // 移动脚本 统计脚本 动画组件
    private Movement moveScript;
    private Stats statsScript;
    private Animator anim;

    // 英雄生死 攻击触发 
    //public bool basicAtkIdle = false;
    public bool isHeroAlive;
    public bool perfoemMeleeAttack = true;
    // Start is called before the first frame update
    void Start()
    {
    
       // 实例化移动脚本
        moveScript = GetComponent<Movement>();
        statsScript = GetComponent<Stats>();
        anim = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
    
    // 当有敌人的时候
        if(targetedEnemy != null)
        {
    
    //敌人和玩家的距离超过攻击范围
            if (Vector3.Distance(gameObject.transform.position,targetedEnemy.transform.position) > attackRange)
            {
    
    // 向敌人方向前进达到攻击范围停止
                moveScript.agent.SetDestination(targetedEnemy.transform.position);
                moveScript.agent.stoppingDistance = attackRange;

                Quaternion rotationToLookAt = Quaternion.LookRotation(targetedEnemy.transform.position - transform.position);

            }
            else
            {
    
    // 当确定了攻击类型攻击敌人
                if (heroAttackType == HeroAttackType.Melee)
                {
    
    // 开始攻击
                    if(perfoemMeleeAttack)
                    {
    
    // 发出攻击消息
                        Debug.Log("Attack The Minion");

                        // 开始攻击的协同方法
                        StartCoroutine(MeleeAttackInterval());
                    }
                }
            }
        }
        IEnumerator MeleeAttackInterval()
        {
    
    // 暂时不能触发攻击
            perfoemMeleeAttack = false;
            // 攻击动画启动
            anim.SetBool("Basic Attack", true);
            // 攻击时间控制攻速
            yield return new WaitForSeconds(statsScript.attackTime);
            // 当敌人没有在锁定的时候
            if(targetedEnemy == null)
            {
    
    // 关闭攻击动画
                anim.SetBool("Basic Attack", false);
                //perfoemMeleeAttack = true;
                
            }
            MeleeAttack(); // 扣血方法

        }
        
    }

    public void MeleeAttack()
    {
    
    // 当锁定到敌人的时候
        if(targetedEnemy != null)
        {
    
       // 判断锁定的是不是敌人
            if(targetedEnemy.GetComponent<Targetable>().enemyType == Targetable.EnemyType.Minion)
            {
    
    // 敌人的血量减去玩家的攻击
                targetedEnemy.GetComponent<Stats>().health -= statsScript.attackDmg;
            }
        }
        perfoemMeleeAttack = true; // 可以再次触发攻击
    }
    
}

status de herói

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // 血条显示需要

public class Health : MonoBehaviour
{
    
       // 玩家血条变量 血条数值变量
    public Slider playerSlider3D;
    private Slider playerSlider2D;
    private Stats statsScript;

    void Start()
    {
    
       // 获取屏幕上的血条 玩家和屏幕上的血条都等于血条数值
        statsScript = GameObject.FindGameObjectWithTag("player").GetComponent<Stats>();
        playerSlider2D = GetComponent<Slider>();
        playerSlider3D.maxValue = statsScript.maxHealth;
        playerSlider2D.maxValue = statsScript.maxHealth;
        statsScript.health = statsScript.maxHealth;
    }


    void Update()
    {
    
       // 屏幕血条数值通过血条数值改动 玩家数值和屏幕数值同步
        playerSlider2D.value = statsScript.health;
        playerSlider3D.value = playerSlider2D.value;
    }
}

status de inimigo

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // 血条显示需要

public class EnemyHealth : MonoBehaviour
{
    
       // 敌人血条变量 血条数值变量
    public Slider enemySlider3D;
    
    private Stats statsScript;

    void Start()
    {
    
       // 获取敌人的血条 赋值最大血量 血量等于最大血量
        statsScript = GameObject.FindGameObjectWithTag("Enemy").GetComponent<Stats>();
        
        enemySlider3D.maxValue = statsScript.maxHealth;

        statsScript.health = statsScript.maxHealth;
    }


    void Update()
    {
    
       // 血量实时同步

        enemySlider3D.value = statsScript.health;
    }
}

Unificar dados

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

public class Stats : MonoBehaviour
{
    
    // 最大血量 当前血量 攻击数值 攻击间隔
    public float maxHealth;
    public float health;
    public float attackDmg;
    //public float attackSpeed;
    public float attackTime;

    HeroCombat heroCombatScript; // 英雄战斗脚本
    
    void Start()
    {
    
       // 获得英雄战斗脚本
        heroCombatScript = GameObject.Find("Player").GetComponent<HeroCombat>();
    }



    void Update()
    {
    
    // 当血量等于0
        if(health <= 0)
        {
    
    // 销毁对象 敌人为空 攻击停止
            Destroy(gameObject);
            heroCombatScript.targetedEnemy = null;
            heroCombatScript.perfoemMeleeAttack = false;
        }
    }
}

mover lógica

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

public class Movement : MonoBehaviour
{
    
       // 导航组件 旋转速度移动 旋转速度 英雄战斗组件
    public NavMeshAgent agent;

    public float rotateSpeedMovement = 0.1f;
    public float rotateVelocity;

    private HeroCombat heroCombatScript;
    // Start is called before the first frame update
    void Start()
    {
    
       // 实例化导航 英雄战斗组件
        agent = gameObject.GetComponent<NavMeshAgent>();
        // 
        heroCombatScript = GetComponent<HeroCombat>();
    }

    // Update is called once per frame
    void Update()
    {
    
    // 当玩家英雄战斗中有战斗的敌人的时候
        if (heroCombatScript.targetedEnemy != null)
        {
    
    // 这个玩家有英雄战斗组件的时候
            if(heroCombatScript.targetedEnemy.GetComponent<HeroCombat>() != null)
            {
    
    // 当条件满足的时候
                if (heroCombatScript.targetedEnemy.GetComponent<HeroCombat>().isHeroAlive)
                {
    
    // 英雄战斗中没有敌人
                    heroCombatScript.targetedEnemy = null;
                }
            }
            
        }
        if (Input.GetMouseButtonDown(1))
        {
    
    // 开放一个射线变量
            RaycastHit hit; // 屏幕上的射线
            if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit,Mathf.Infinity))
            {
    
    // 射线碰到地面
                if(hit.collider.tag == "Floor")
                {
    
    // 玩家移动到目的地 敌人为空时 
                    agent.SetDestination(hit.point);
                    heroCombatScript.targetedEnemy = null;
                }
                
            }
        }
    }
}

Acho que você gosta

Origin blog.csdn.net/qq_60839745/article/details/128748506
Recomendado
Clasificación