伪工厂模式制造敌人
实现效果

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);}//如果距离玩家角色小于2cmEnemyAttackDistanceif (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的CDif (CD > 0.2f){//重置CDCD = 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 framevoid Update(){transform.position = player.transform.position - vecter3;}
}
挂载

相关文章:
伪工厂模式制造敌人
实现效果 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; interna…...
【linux】pwd命令
pwd 命令在 Linux 和类 Unix 系统中用于显示当前工作目录的完整路径。它是 "print working directory" 的缩写。 当你在终端或命令行界面中工作时,你可能会在不同的目录(或文件夹)之间切换。pwd 命令帮助你确定你当前位于哪个目录…...
Python 如何封装工具类方法,以及使用md5加密
第一步:封装使用方法 在utils目录中,编写我的md5加密的方法,如下: import re import hashlib from os import path from typing import Callable from flask import current_app# 这里封装的是工具类的方法def basename(filenam…...
网络编程的应用
目录 1.单机程序和网络程序 2.客户端与服务端 3.网络编程三要素 3.1 IP地址 3.2 port端口 4.TCP编程 5.UDP编程 1.单机程序和网络程序 之前编写的程序都是单机程序,所有的业务功能实现及数据存储都在一个主机上完成,我们称为单机程序 我们在生活…...
佰朔资本:国内海风加速招标 船舶行业景气上行
昨日,沪指盘中一度下探失守2700点,尾盘在地产、银行等板块的带动下发力上扬,深证成指亦翻红。到收盘,沪指涨0.49%报2717.28点,深证成指涨0.11%报7992.25点,创业板指跌0.11%报1533.47点,上证50指…...
理解AAC和Opus的编码与解码流程
理解AAC和Opus的编码与解码流程及其在Android中的实现,对于音频开发非常重要。下面,我将详细解释这两种编码格式的原理、流程,并结合具体代码示例,帮助你在Android项目中合理地设计和使用它们。 一、AAC(Advanced Audio Coding) 1. AAC的原理与流程 AAC是一种有损音频压…...
设计图纸加密方法知多少?小编给你讲清楚
一、对称加密 使用对称加密算法,对设计图纸进行加密。对称加密使用相同的密钥进行加密和解密,确保只有持有正确密钥的人能够解密文件。 二、非对称加密 使用非对称加密算法,进行设计图纸的加密。非对称加密使用公钥加密、私钥解密的方式&a…...
pycv实时目标检测快速实现
使用python_cv实现目标实时检测 python 安装依赖核心代码快速使用实现结果展示enjoy python 安装依赖 opencv_python4.7.0.72 pandas1.5.3 tensorflow2.11.0 tensorflow_hub0.13.0 tensorflow_intel2.11.0 numpy1.23.5核心代码快速使用 # 使用了TensorFlow Hub和OpenCV库来实…...
记录下如何让字体在div内 自动换行 上下居中
div内样式 display: flex; // flex布局 justify-content: center; // 上下居中 align-items: center; // 左右居中 overflow-wrap: break-word; // 允许字体换行 (若行内的单词无法放下则换行) word-break: break-all; // 强制文本在任意字符间进…...
Shell篇之编写MySQL启动脚本
Shell篇之编写MySQL启动脚本 1. 脚本内容 vim mysql_ctl.sh#!/bin/bashmysql_port3306 mysql_username"root" mysql_password"molinker" mysql_conf"/opt/lanmp/mysql/etc/my.cnf" mysql_sock"/opt/lanmp/mysql/var/mysql.sock"func…...
supermap Iclient3d for cesium加载地形并夸大地形
先看效果图 这是没有夸张之前的都江堰 这是夸大五倍后的都江堰 下面展示代码 主要就是加载supermaponline的skt地形然后夸大 <template><div class"PartOneBox"><div id"cesiumContainer"></div></div> </template>…...
一文解读OLAP的工具和应用软件
OLAP(OnlineAnalyticalProcessing)是一种用于快速分析大规模、多维度数据的方法。OLAP工具和应用软件则是帮助人们进行OLAP分析的重要工具。本文将介绍几种常见的OLAP工具和应用软件,并探讨它们在数据分析中的作用。 一 OLAP工具的分类 在选…...
xml重点笔记(尚学堂 3h)
XML:可扩展标记语言 主要内容(了解即可) 1.XML介绍 2.DTD 3.XSD 4.DOM解析 6.SAX解析 学习目标 一. XML介绍 1.简介 XML(Extensible Markup Language) 可扩展标记语言,严格区分大小写 2.XML和HTML XML是用来传输和存储数据的。 XML多用在框架的配置文件…...
爬虫代理API的全面解析:让数据抓取更高效
在大数据时代,网络爬虫已经成为收集和分析数据的重要工具。然而,频繁的请求会导致IP被封禁,这时候爬虫代理API就显得尤为重要。本文将详细介绍爬虫代理API的作用、优势及如何使用,帮助你更高效地进行数据抓取。 什么是爬虫代理AP…...
PCL 点云中的植被信息提取(C++详细过程版)
目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接,首发于:2024年9月18日。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的抄袭狗。 一、算法原理 1、原理概述 点云具有丰富的色彩信息,可以与植被指数结合使…...
requests-html的具体使用方法有哪些?
requests-html是一个功能强大的Python库,用于发送HTTP请求和解析HTML内容。它的使用方法包括安装库、基本使用、发送带有参数的请求、图片抓取实战案例、解析网页内容、执行JavaScript代码、使用CSS选择器来查找元素、继续跟踪链接并获取内容等。 安装request…...
YOLOv9改进策略【卷积层】| AKConv: 具有任意采样形状和任意参数数量的卷积核
一、本文介绍 本文记录的是利用AKConv优化YOLOv9的目标检测网络模型。标准卷积操作的卷积运算局限于局部窗口,无法捕获其他位置的信息,且采样形状固定,无法适应不同数据集和位置中目标形状的变化。而AKConv旨在为卷积核提供任意数量的参数和…...
图神经网络池化方法
图神经网络池化方法 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 图神经网络池化方法前言一、扁平图池化二、分层图池化1.节点聚类池化2.节点丢弃池化 参考文献 前言 图池化操作根据其池化策略的差异ÿ…...
小琳AI课堂:确保大语言模型安全的八大策略--从数据隐私到用户教育
大家好,这里是小琳AI课堂。今天我们深入探讨如何保证大语言模型的安全,这可是关系到我们每个人哦!🔐 首先,我们要明白,保证大语言模型的安全,需要从多个方面入手,确保模型在技术、法…...
Python 数学建模——高斯核密度估计
文章目录 前言原理代码实例scipy 实现seaborn 实现 前言 高斯核密度估计本是一种机器学习算法,在数学建模中也可以发挥作用。本文主要讨论用它来拟合变量的概率密度,获得概率密度函数 f ( x ) f(x) f(x)。 原理 已知一个连续型随机变量 X X X 的一系列…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
