返回首页DA系统C#IDE文件同步服务屏保 今天是: 2026-05-05    "立夏"  夏季的第一个节气,表示盛夏时节的正式开始

搜索
热搜: linux 技术
Hi~登录注册
查看: 2077|回复: 0

[原创] 【原创】英雄无敌项目-敌人移动、寻路目标点、敌人信息类

[复制链接]
发表于 2021-5-5 18:31:30 | 显示全部楼层 |阅读模式

少侠不来段修仙之旅吗~

您需要 登录 才可以下载或查看,没有帐号?注册成为修仙之旅的少年~

x
本帖最后由 da11 于 2021-5-6 00:35 编辑

//敌人移动类--重点模块
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 敌人移动类,用于敌人向着目标点旋转,向着前方前进,判断是否已经到达目标点
/// </summary>
public class EnemyMove : MonoBehaviour
{
    /// <summary>
    /// 判断目标点字段
    /// </summary>
    private bool pd1;

    /// <summary>
    /// 存储路线节点元素的int类型字段
    /// </summary>
    private int fornum;

    /// <summary>
    /// 存储路线节点元素数组,测试使用,在Unity面板中定义数组长度及数组元素的内容
    /// </summary>
    public GameObject[] LineNodeObj;

    /// <summary>
    /// 声明时间字段,控制帧数
    /// </summary>
    private float TimeCache;

    private float SpeedZzhou=10;

    private void Start()
    {
        //定义时间字段为当前时间加0.1秒
        TimeCache = Time.time + 0.1F;
    }


    //提供敌人旋转的方法,向着目标点旋转--√
    public void EnemyRotateFF(Vector3 Coordinate)
    {
        this.transform.LookAt(Coordinate);
    }

    //提供敌人向前方移动的方法--提供重载方法,另外一个方法提供移动速度变量
    public void EnemyMoveFF()
    {
        this.transform.Translate(0,0,SpeedZzhou * Time.deltaTime);
        //使用this.transform.Translate(Vector3.forward);同等以上效果
    }

    //判定敌人是否到达目标点方法
    public bool JudgeGotoNode(Vector3 EnemyVector,Vector3 Coordinate)
    {
        //-----------位置确认是否相等精度需要完全相等判断,太精准会导致如果移动速度过快,对不上会一直尝试对的上的情况。
        /*
        if (EnemyVector == Coordinate)
        {
            return true;
        }
        */

        //-----------位置确认是否相等精度降低至int类型

        int EnemyXZhou = (int)EnemyVector.x;
        int EnemyYZhou = (int)EnemyVector.y;
        int EnemyZZhou = (int)EnemyVector.z;

        int CoordinateXZhou = (int)Coordinate.x;
        int CoordinateYZhou = (int)Coordinate.y;
        int CoordinateZZhou = (int)Coordinate.z;

        //float DistanceNum = Vector3.Distance(EnemyVector, Coordinate);
        //使用Vector3.Distance方法可以更加精准的控制两点之间判断相等的举例
        //Vector3.Distance语法:Vector3.Distance(一个Vector3坐标,另一个Vector3坐标); 返回float类型,视为两点之间的距离

        if (EnemyXZhou == CoordinateXZhou && EnemyYZhou == CoordinateYZhou && EnemyZZhou == CoordinateZZhou)
        {
            return true;
        }

        return false;

        //float DistanceNum = Vector3.Distance(EnemyVector, Coordinate);
    }

    /// <summary>
    /// 寻路方法
    /// </summary>
    private void WayFinding()
    {
        //判断敌人位置与目标点位置是否相等
        pd1 = JudgeGotoNode(this.transform.position, LineNodeObj[fornum].transform.position);
        //不相等执行以下操作
        if (pd1 == false)
        {
            //对着点旋转
            EnemyRotateFF(LineNodeObj[fornum].transform.position);

            //向前方前进需要加入时间限制,调试代码段

            /*
            if (Time.time >= TimeCache)
            {
                TimeCache = Time.time + 0.1F;
                print("延迟0.1秒记录");
                //向前方前进
                //EnemyNullObj.transform.Translate(Vector3.forward);

                EnemyMoveFF();



                print(this.transform.position); //测试语句,打印当前位置
                print(LineNodeObj[fornum].transform.position); //测试语句,打印目标点位置
                print(fornum); //测试语句,打印当前前往的目标点元素位置

            }
            */

            EnemyMoveFF();

            print(this.transform.position); //测试语句,打印当前位置
            print(LineNodeObj[fornum].transform.position); //测试语句,打印目标点位置
            print(fornum); //测试语句,打印当前前往的目标点元素位置
        }
        else if (fornum == LineNodeObj.Length - 1) //到达目标点数组的最大值
        {
            print("到点!!");
            print(pd1);
            //Object.Destroy(this.gameObject); //测试点,到达目标点后,删除当前敌人物体
            Object.Destroy(this.gameObject.GetComponent<EnemyMove>());//测试点,到达目标点后,删除当前敌人移动脚本组件
        }
        else                                    //到达一个目标点
        {
            print("到点!!");
            print(pd1);
            fornum += 1;
        }
    }

    private void Update()
    {
        WayFinding();
    }

}


 楼主| 发表于 2021-5-5 18:39:48 | 显示全部楼层
以下是以上脚本实际运行图:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册成为修仙之旅的少年~

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-6 00:35:48 | 显示全部楼层
//敌人信息类
//EnemyInfo.cs

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

/// <summary>
/// 敌人信息类
/// </summary>
public class EnemyInfo : MonoBehaviour
{
    /// <summary>
    /// 敌人当前血量为100
    /// </summary>
    public float HP=100;

    /// <summary>
    /// 敌人默认最大的血量为100
    /// </summary>
    public float MaxHP = 100;

    /// <summary>
    /// 敌人受伤的方法
    /// </summary>
    /// <param name="HP">扣除血量形参</param>
    public void injured(float HP)
    {
        if (this.HP-HP==this.HP)
        {
            Debug.Log("没有受伤");
        }
        else if (this.HP - HP <= 0)
        {
            IsDead();            
        }

        Debug.Log("受伤了");

    }

    /// <summary>
    /// 敌人死亡方法
    /// </summary>
    /// <returns></returns>
    public bool IsDead()
    {
        Debug.Log("敌人死亡");
        return true;
        Object.Destroy(this.gameObject);
    }

}


回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-18 16:58:48 | 显示全部楼层
//2021.05.18更新,根据敌人生成器模块代码补充,敌人信息类增加了敌人死亡调用(回调)敌人生成器的创建敌人方法,加粗字体为新增内容!
//EnemyInfo.cs

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

/// <summary>
/// 敌人信息类
/// </summary>
public class EnemyInfo : MonoBehaviour
{
    /// <summary>
    /// 敌人当前血量为100
    /// </summary>
    public float HP=100;

    /// <summary>
    /// 敌人默认最大的血量为100
    /// </summary>
    public float MaxHP = 100;

    //敌人死亡延迟时间,默认设置为1秒
    private float EnemyDeathDelay=1;

    //敌人生成器引用字段
    public EnemySpawn enemyspawn;

    /// <summary>
    /// 敌人受伤的方法
    /// </summary>
    /// <param name="HP">扣除血量形参</param>
    public void injured(float HP)
    {
        if (this.HP-HP==this.HP)
        {
            Debug.Log("没有受伤");
        }
        else if (this.HP - HP <= 0)
        {
            IsDead();            
        }

        Debug.Log("受伤了");
        this.HP -= HP;

    }

    /// <summary>
    /// 敌人死亡方法
    /// </summary>
    public void IsDead()
    {
        //Debug.Log("敌人死亡");
        //播放敌人死亡动画

        var EnemyInfoAnimation = GetComponent<EnemyDH>();
        EnemyInfoAnimation.DHplayVar.DHPlayFF(EnemyInfoAnimation.DeathDH);
        //以下同等效果,直接调用
        //this.GetComponent<EnemyControl>().EnemyDHVar.DHplayVar.DHPlayFF(this.GetComponent<EnemyControl>().EnemyDHVar.DeathDH);

        //销毁游戏物体
        Object.Destroy(this.gameObject,EnemyDeathDelay);

        //敌人死亡后调用延迟生成敌人方法,获取同一级物体的组件使用GameObject.FindObjectOfType方法获取,只有一个敌人生成器的时候可以使用
        //EnemySpawn EnemySpwanDelay = GameObject.FindObjectOfType<EnemySpawn>();
        //EnemySpwanDelay.EnemyDeadWayLineAddFF(); //增加回可用路线
        //EnemySpwanDelay.EnemyOnlySpawnDelay(); //生成敌人

        enemyspawn.EnemyDeadWayLineAddFF();             //增加回可用路线
        enemyspawn.EnemyOnlySpawnDelay();               //生成敌人

    }

}


回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-18 17:02:55 | 显示全部楼层
//2021.05.18更新,根据敌人生成器模块代码补充,敌人移动类将使用路线类获得的路点进行寻路!
//EnemyMove.cs

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

/// <summary>
/// 敌人移动类,用于敌人向着目标点旋转,向着前方前进,判断是否已经到达目标点
/// </summary>
public class EnemyMove : MonoBehaviour
{
    /// <summary>
    /// 判断目标点字段
    /// </summary>
    private bool pd1;

    /// <summary>
    /// 存储路线节点元素的int类型字段
    /// </summary>
    private int fornum;

    /// <summary>
    /// 存储路线节点元素数组,已在敌人生成器类中传递WayLine类引用
    /// </summary>
    public WayLine wayline;

    /// <summary>
    /// 声明时间字段,控制帧数
    /// </summary>
    private float TimeCache;

    private float SpeedZzhou=10;

    private void Start()
    {
        //定义时间字段为当前时间加0.1秒
        TimeCache = Time.time + 0.1F;


    }


    //提供敌人旋转的方法,向着目标点旋转--√
    public void EnemyRotateFF(Vector3 Coordinate)
    {
        this.transform.LookAt(Coordinate);
    }

    //提供敌人向前方移动的方法--提供重载方法,另外一个方法提供移动速度变量
    public void EnemyMoveFF()
    {
        this.transform.Translate(0,0,SpeedZzhou * Time.deltaTime);
        //使用this.transform.Translate(Vector3.forward);同等以上效果
    }

    //判定敌人是否到达目标点方法
    public bool JudgeGotoNode(Vector3 EnemyVector,Vector3 Coordinate)
    {
        //-----------位置确认是否相等精度需要完全相等判断,太精准会导致如果移动速度过快,对不上会一直尝试对的上的情况。
        /*
        if (EnemyVector == Coordinate)
        {
            return true;
        }
        */

        //-----------位置确认是否相等精度降低至int类型

        int EnemyXZhou = (int)EnemyVector.x;
        int EnemyYZhou = (int)EnemyVector.y;
        int EnemyZZhou = (int)EnemyVector.z;

        int CoordinateXZhou = (int)Coordinate.x;
        int CoordinateYZhou = (int)Coordinate.y;
        int CoordinateZZhou = (int)Coordinate.z;

        //float DistanceNum = Vector3.Distance(EnemyVector, Coordinate);
        //使用Vector3.Distance方法可以更加精准的控制两点之间判断相等的举例
        //Vector3.Distance语法:Vector3.Distance(一个Vector3坐标,另一个Vector3坐标); 返回float类型,视为两点之间的距离

        if (EnemyXZhou == CoordinateXZhou && EnemyYZhou == CoordinateYZhou && EnemyZZhou == CoordinateZZhou)
        {
            return true;
        }

        return false;

        //float DistanceNum = Vector3.Distance(EnemyVector, Coordinate);
    }

    /// <summary>
    /// 寻路方法
    /// </summary>
    public bool WayFinding()
    {
        //判断敌人位置与目标点位置是否相等
        pd1 = JudgeGotoNode(this.transform.position, wayline.Vector3Var[fornum]);
        //不相等执行以下操作
        if (pd1 == false)
        {
            //对着点旋转
            EnemyRotateFF(wayline.Vector3Var[fornum]);

            //向前方前进需要加入时间限制,调试代码段

            /*
            if (Time.time >= TimeCache)
            {
                TimeCache = Time.time + 0.1F;
                print("延迟0.1秒记录");
                //向前方前进
                //EnemyNullObj.transform.Translate(Vector3.forward);

                EnemyMoveFF();



                print(this.transform.position); //测试语句,打印当前位置
                print(LineNodeObj[fornum].transform.position); //测试语句,打印目标点位置
                print(fornum); //测试语句,打印当前前往的目标点元素位置

            }
            */

            EnemyMoveFF();

            //print(this.transform.position); //测试语句,打印当前位置
            //print(wayline.Vector3Var[fornum]); //测试语句,打印目标点位置
            //print(fornum); //测试语句,打印当前前往的目标点元素位置

        }
        else if (fornum == wayline.Vector3Var.Length - 1) //到达目标点数组的最大值
        {
            //print("到点!!");
            //print(pd1);
            //Object.Destroy(this.gameObject); //测试点,到达目标点后,删除当前敌人物体
            //Object.Destroy(this.gameObject.GetComponent<EnemyMove>());//测试点,到达目标点后,删除当前敌人移动脚本组件
            return true;  //true状态代表,寻路到达了所有路线节点的终点
        }
        else                                    //到达一个目标点
        {
            //print("到点!!");
            //print(pd1);
            fornum += 1;

        }

        return false;  //false状态代表,寻路还没有到达所有路线节点的终点
    }


}


回复 支持 反对

使用道具 举报

游客
回复
*滑块验证:

DA论坛飞机票来了~
快速回复 返回顶部 返回列表