伪工厂模式制造敌人

news2024/9/21 10:26:49

实现效果

1.敌人方实现

敌人代码


using UnityEngine;
using UnityEngine.UI;

public  class EnemyBasics : MonoBehaviour
{
    public int EnemySpeed { get; internal set; }
    public int EnemyAttackDistance { get; internal set; }
    public int EnemyChaseDistance { get; internal set; }

    /*    //初级怪物,可以慢速追击
public abstract void  SlowEnemy(GameObject player, float distance, Text gameOverText, Image gameOverImage);
//中级怪物。可以快速追击
public abstract void MiddelEnemy(GameObject player, float distance, Text gameOverText, Image gameOverImage);
//高级怪物,可以发射子弹
public abstract void HighEnemy(GameObject player, float distance, Text gameOverText, Image gameOverImage);*/
    public  void UpdateEnemy(GameObject player, float distance, Text gameOverText, Image gameOverImage)
    {
        //如果距离小于10cmEnemyChaseDistance,追踪玩家角色
        if (distance < EnemyChaseDistance)
        {
            transform.LookAt(player.transform);
            //向玩家角色移动
            transform.Translate(Vector3.forward * EnemySpeed * Time.deltaTime);
        }
        //如果距离玩家角色小于2cmEnemyAttackDistance
        if (distance < EnemyAttackDistance)
        {
            gameOverText.text = "玩家角色死亡,游戏结束";
            gameOverImage.gameObject.SetActive(true);
            Time.timeScale = 0;
        }
    }
   
}

using UnityEngine;
using UnityEngine.UI;

public class EnemyFactory : MonoBehaviour
{
    [SerializeField] private GameObject slowEnemyPrefab;
    [SerializeField] private GameObject middleEnemyPrefab;
    [SerializeField] private GameObject highEnemyPrefab;

    public void CreateEnemy(int type, Vector3 position)
    {
        GameObject enemy = null;
        switch (type)
        {
            case 1:
                enemy = Instantiate(slowEnemyPrefab, position, Quaternion.identity);
                enemy.tag = "SlowEnemy";
               // enemy.AddComponent<EnemyBasics>();
                enemy.GetComponent<EnemyBasics>().EnemySpeed = 1;
                enemy.GetComponent<EnemyBasics>().EnemyAttackDistance = 1;
                enemy.GetComponent<EnemyBasics>().EnemyChaseDistance = 8;
                
                break;
            case 2:
                enemy = Instantiate(middleEnemyPrefab, position, Quaternion.identity);
                enemy.tag = "MiddleEnemy";
                //enemy.AddComponent<EnemyBasics>();
                enemy.GetComponent<EnemyBasics>().EnemySpeed = 3;
                enemy.GetComponent<EnemyBasics>().EnemyAttackDistance = 1;
                enemy.GetComponent<EnemyBasics>().EnemyChaseDistance = 12;
               // enemy.AddComponent<EnemyBasics>();
                break;
            case 3:
                enemy = Instantiate(highEnemyPrefab, position, Quaternion.identity);
                enemy.tag = "HighEnemy";
               // enemy.AddComponent<EnemyBasics>();
                enemy.GetComponent<EnemyBasics>().EnemySpeed = 5;
                enemy.GetComponent<EnemyBasics>().EnemyAttackDistance = 1;
                enemy.GetComponent<EnemyBasics>().EnemyChaseDistance = 20;
                //enemy.AddComponent<EnemyBasics>();
                break;
        }

        if (enemy != null)
        {
            enemy.layer = LayerMask.NameToLayer("Enemy");
        }
    }
   
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class EnemyControl : MonoBehaviour
{
    private GameObject player;
    [SerializeField] private Text gameOverText;
    [SerializeField] private Image gameOverImage;
    private EnemyFactory enemyFactory;

    void Start()
    {
        player = GameObject.FindWithTag("Player");
        enemyFactory = GetComponent<EnemyFactory>();

        // 创建敌人实例
        enemyFactory.CreateEnemy(1, new Vector3(0, 1, 0));
        Debug.Log("初级敌人创建成功");
        enemyFactory.CreateEnemy(2, new Vector3(10, 1, 0));
        Debug.Log("中级敌人创建成功");
        enemyFactory.CreateEnemy(3, new Vector3(20, 1, 0));
        Debug.Log("高级敌人创建成功");
    }

    void Update()
    {
        if (player == null)
        {
            Debug.LogError("Player object is not assigned.");
            return;
        }
        GameObject[] slowEnemys = GameObject.FindGameObjectsWithTag("SlowEnemy");
        GameObject[] middleEnemys = GameObject.FindGameObjectsWithTag("MiddleEnemy");
        GameObject[] highEnemys = GameObject.FindGameObjectsWithTag("HighEnemy");

        HandleEnemies(slowEnemys);
        HandleEnemies(middleEnemys);
        HandleEnemies(highEnemys);
    }

    private void HandleEnemies(GameObject[] enemies)
    {
        foreach (GameObject enemy in enemies)
        {

            if (enemy != null )
            {
                float distance = Vector3.Distance(player.transform.position, enemy.transform.position);
                Debug.Log(enemy.tag+"   "+ distance);
                enemy.GetComponent<EnemyBasics>().UpdateEnemy(player, distance, gameOverText, gameOverImage);
            }

        }
    }

  /*  private void HandleEnemies(GameObject[] enemies)
    {
        foreach (GameObject enemy in enemies)
        {
            if (enemy != null)
            {
                EnemyBasics enemyBasics = enemy.GetComponent<EnemyBasics>();
                if (enemyBasics != null)
                {
                    float distance = Vector3.Distance(player.transform.position, enemy.transform.position);
                    Debug.Log($"{enemy.tag} - Distance: {distance}");

                    try
                    {
                        enemyBasics.UpdateEnemy(player, distance, gameOverText, gameOverImage);
                    }
                    catch (System.Exception ex)
                    {
                        Debug.LogError($"Error in UpdateEnemy for {enemy.name}: {ex.Message}");
                    }
                }
                else
                {
                    Debug.LogError($"EnemyBasics component missing on {enemy.name}");
                }
            }
            else
            {
                Debug.LogWarning("Encountered a null enemy in the array.");
            }
        }
    }*/
}




挂载实现

预制体一览

2.我方实现

玩家控制代码

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    float CD = 2;
    [SerializeField] private GameObject BombPre;
    void Update()
    {
        //获取水平虚拟轴
        float horizontal = Input.GetAxis("Horizontal");
        //获取垂直虚拟轴
        float vertical = Input.GetAxis("Vertical");
        //创建一个向量,该向量为用户按下按键对应的向量
        //这里让horizontal控制x轴移动,vertical控制z轴移动
        Vector3 dir = new Vector3(vertical,  0, -horizontal);

        //如果向量不为0,证明玩家一定按了方向键
        if (dir != Vector3.zero)
        {
            //玩家转向dir向量的方向
            transform.rotation = Quaternion.LookRotation(dir);
            //Update是按帧刷新的,如果参数不乘以Time.deltaTime,代表的含义为每帧移动2m
            //所以这里做一个转换,让2乘以帧时间间隔Time.deltaTi//即可转换单位,从每帧移动2m变为每秒移动2m
            //转换单位还可以同步不同设备的速度,
            //因为不同的设备可能有不同的帧率,所以如果不转换单位
            //那么可能看到不同设备下的移动速度是不同的
            transform.Translate(Vector3.forward * 7 * Time.deltaTime);
        }
        CD += Time.deltaTime;
        //如果按下U键
        if (Input.GetKeyDown(KeyCode.U))
        {
            Debug.Log("检测到玩家按下U键,放下炸弹");
            //2s的CD
            if (CD > 0.2f)
            {
                //重置CD
                CD = 0;
                //释放炸弹
                Instantiate(BombPre, transform.position, transform.rotation);
            }
        }
    }
}

挂载

摄像机代码(或者直接把摄像机变成玩家的子物体,就不用写代码了)

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

public class CameraControllerr : MonoBehaviour
{
    //保存向量
    private Vector3 vecter3;
    private Transform player;
    
    void Start()
    {
        //两种方法找Player
       // player = GameObject.Find("Player").transform;
        player = GameObject.FindGameObjectWithTag("Player").transform;
        vecter3 =player.transform.position-transform.position;
    }

    // Update is called once per frame
    void Update()
    {
        transform.position = player.transform.position - vecter3;
    }
}

挂载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2144516.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv8 OBB win10+ visual 2022移植部署

前言 想做一个目标旋转角度检测的工程&#xff0c;但是网上多少python的&#xff0c;或者linux的。在win10 visual 2022移植部署&#xff0c;记录一下。 参考 这篇文章没有C win10 环境下的部署教程&#xff0c;我相对于是对此做了补充。 1、下载工程 https://github.com/sh…

Matlab 的.m 文件批量转成py文件

在工作中碰到了一个问题&#xff0c;需要将原来用matlab gui做出来的程序改为python程序&#xff0c;因为涉及到很多文件&#xff0c;所以在网上搜了搜有没有直接能转化的库。参考了【Matlab】一键Matlab代码转python代码详细教程_matlab2python-CSDN博客 这位博主提到的matla…

Redis安装 ▎Redis详细知识点

前言: Redis是一个开源的内存数据结构存储&#xff0c;支持丰富的数据类型&#xff0c;如字符串、哈希、列表、集合和有序集合,作为一个键值对数据库&#xff0c;Redis能提供毫秒级的响应时间&#xff0c;适合高并发应用场景。它还支持持久化&#xff0c;将内存数据定期保存到…

路由器接口配置DHCP实验简述

一、路由器配置 [Huawei]undo info-center enable Info: Information center is disabled. [DHCP-SERVER]sysname DHCP-Server [DHCP-Server]dis this sysname DHCP-Server undo info-center enable return [DHCP-Server]dhcp enable Info: The operation may take a few secon…

【pytorch学习笔记,利用Anaconda安装pytorch和paddle深度学习环境+pycharm安装---免额外安装CUDA和cudnn】

作者链接: link 一、安装pytorch环境 1.打开打开anaconda的终端后 conda env list然后创建一个名字叫pytorch&#xff0c;python是3.8版本的环境 conda create -n pytorch python3.8再次看环境 conda env list# conda environments: #显示如下环境 base …

Rust GUI框架Tauri V1 入门

文章目录 Tauri介绍Vite开始创建 Rust 项目 调用指令window.__TAURI_INVOKE__.invoke is undefined 问题 参考资料JavaScript 模块Vue 框架Vue RouteviteNuxt gitignore文件上传到csdn gitcode网站端本地端 gitcode发布 Tauri介绍 Tauri是一款用Rust构建的开源框架&#xff0c…

私有化通讯工具:安全、高效、个性化,重塑企业沟通生态

在当今数字化时代&#xff0c;即时通讯已成为企业日常运营中不可或缺的一部分。随着数据安全和隐私保护意识的日益增强&#xff0c;越来越多的企业开始寻求更加安全、可控的沟通方式。私有化聊天工具应运而生&#xff0c;以其独特的核心优势&#xff0c;为企业构建了一个安全、…

选购到不好的宠物空气净化器会有什么危害?有哪几款推荐

前三个月真的是被我男朋友气到了&#xff0c;明明说好的一起养猫&#xff0c;他又嫌这嫌那的&#xff0c;真的是无语住。 在养猫前的一个月就说好了&#xff0c;谁下班早谁就先回家收拾&#xff0c;包括进门开窗通风、给猫喂食、还有铲猫砂盆。但是他现在抱怨说太麻烦了&#…

【PSINS工具箱】仅速度为观测量的SINS/GNSS组合导航,MATLAB源代码,无需下载,可直接复制

工具箱 本程序需要在安装工具箱后使用,工具箱是开源的,链接:http://www.psins.org.cn/kydm 程序简述 原文的153组合导航是SINS/GPS下的位置观测或位置+速度观测,本文所述的代码是仅三轴位置观测的,使用UKF来滤波。 最后输出速度对比、速度误差、姿态对比、姿态误差、位…

基于SpringBoot+Vue的房屋租赁平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

HT3163 免电感滤波25W AB/D类音频功放

特征 输出功率 15W (VDD12V, RL4Ω,THDN1%, Class D) 20W(VDD14V,RL4Ω,THDN1%, Class D) 25W(VDD14V,RL4Ω,THDN10%, Class D) 7.5W(VDD7.4V,RL4Ω,THDN10%, Class AB) 17W(VDD12V,RL4Ω,THDN10%, Class AB) 单电源系统&#xff0c;3V-16V宽电压输入范围 低静态电流: 7mA (VD…

制造业应用人工智能!成本与效益的博弈

制造业应用人工智能&#xff01;成本与效益的博弈 前言制造业应用人工智能 前言 制造业一直是国家经济的重要支柱&#xff0c;而现在&#xff0c;人工智能的出现正在给制造业带来一场前所未有的变革。就像是一场风暴&#xff0c;席卷了整个制造业的世界&#xff0c;让一切都变…

net await 、 Task、 Async 不用async异步方法

详细资料 lamda 变成异步方法 &#xff0c;只要在前面 加 async 修饰 即可 》》await 修饰的 &#xff0c;await 所在的方法&#xff0c;必须修饰 async ThreadPool.QueueUserWorkItem( async (obj)>{while(true){await File.WriteAllTextAsync("路径","…

AORO A30防爆手机震撼发布,红外热成像尽显巡检“科技范儿”

随着工业化的深入发展&#xff0c;各类“危、急、特”场景&#xff08;如化工园区、矿山作业、消防救援等&#xff09;的安全巡检任务日益繁重且复杂多变。面对极端环境下的安全隐患&#xff0c;传统巡检手段显得力不从心&#xff0c;行业痛点亟待解决。遨游通讯凭借其深厚的技…

二维结构迭代次数顺序的连续性

在行列可自由变换的条件下&#xff0c;平面上的3点结构只有6个 4点结构只有16个 3点结构按照训练集A-B矩阵的高有3s1和3s2两种顺序&#xff0c;同样4点结构也有4s1和4s2两种顺序。4s1可以用结构加法转化成3点结构顺序4s1-3. (A,B)---6*n*2---(0,1)(1,0) 分类A和B&#xff0c;…

若依的使用

目录 一、启动步骤 二、重要的功能点&#xff1a; 1、登录&#xff1a; 流程&#xff1a; 前端&#xff1a; 注册&#xff1a; 2、创建子项目 3、导出 1、后台&#xff1a; 2、前端 三、如何生成代码&#xff1a; 一、启动步骤 将sql导入数据库。。。启动redis&…

57页PPT | 智慧文旅整体建设解决方案

主要介绍了智慧文旅的建设背景、需求分析、解决方案、应用系统功能需求、客户价值、企业价值、建设理念、建设思路、总体架构、安全管理体系、融媒体综合服务平台、大数据分析平台、智慧文旅云平台、智慧管理、智慧营销、智慧服务等方面的内容。 背景及需求分析 方案架构及理念…

【Vue】- 路由及传参

文章目录 知识回顾前言源码分析1. 声明式导航2. 路由传参3. 可选符4. 重定向5. 4046. 跳转及传参7. 路由懒加载拓展知识总结router-link静态传参和动态路由的对比知识回顾 前言 什么是单页面应用程序? ● 所有功能在一个html页面上实现 单页面应用优缺点? ● 优点:按需更新…

Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 新一代垃圾回收器 ZGC 收集器

文章目录 垃圾回收机制垃圾收集器垃圾收集器分类ZGC 收集器ZGC 的性能优势复制算法指针染色读屏障 ZGC 的工作过程Stop-The-World 暂停阶段并发阶段 垃圾回收机制 垃圾回收&#xff08;Garbage Collection&#xff0c;GC&#xff09;&#xff0c;顾名思义就是释放垃圾占用的空…

第二期: 第11节, uboot 命令的使用

问题&#xff1a;如果你只想控制一个led 灯&#xff0c;并且不想去写驱动。 那么可以直接 使用uboot 的命令&#xff0c;去改写内存。 uboot 命令的解析&#xff1a; 读命令&#xff0c; md[.b, .w. .l] address 注意&#xff1a; 这里的 .w 指的是两个字节&#xff0c;…