当前位置: 首页 > news >正文

伪工厂模式制造敌人

实现效果

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" 的缩写。 当你在终端或命令行界面中工作时&#xff0c;你可能会在不同的目录&#xff08;或文件夹&#xff09;之间切换。pwd 命令帮助你确定你当前位于哪个目录…...

Python 如何封装工具类方法,以及使用md5加密

第一步&#xff1a;封装使用方法 在utils目录中&#xff0c;编写我的md5加密的方法&#xff0c;如下&#xff1a; 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.单机程序和网络程序 之前编写的程序都是单机程序&#xff0c;所有的业务功能实现及数据存储都在一个主机上完成&#xff0c;我们称为单机程序 我们在生活…...

佰朔资本:国内海风加速招标 船舶行业景气上行

昨日&#xff0c;沪指盘中一度下探失守2700点&#xff0c;尾盘在地产、银行等板块的带动下发力上扬&#xff0c;深证成指亦翻红。到收盘&#xff0c;沪指涨0.49%报2717.28点&#xff0c;深证成指涨0.11%报7992.25点&#xff0c;创业板指跌0.11%报1533.47点&#xff0c;上证50指…...

理解AAC和Opus的编码与解码流程

理解AAC和Opus的编码与解码流程及其在Android中的实现,对于音频开发非常重要。下面,我将详细解释这两种编码格式的原理、流程,并结合具体代码示例,帮助你在Android项目中合理地设计和使用它们。 一、AAC(Advanced Audio Coding) 1. AAC的原理与流程 AAC是一种有损音频压…...

设计图纸加密方法知多少?小编给你讲清楚

一、对称加密 使用对称加密算法&#xff0c;对设计图纸进行加密。对称加密使用相同的密钥进行加密和解密&#xff0c;确保只有持有正确密钥的人能够解密文件。 二、非对称加密 使用非对称加密算法&#xff0c;进行设计图纸的加密。非对称加密使用公钥加密、私钥解密的方式&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; // 允许字体换行 &#xff08;若行内的单词无法放下则换行&#xff09; 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&#xff08;OnlineAnalyticalProcessing&#xff09;是一种用于快速分析大规模、多维度数据的方法。OLAP工具和应用软件则是帮助人们进行OLAP分析的重要工具。本文将介绍几种常见的OLAP工具和应用软件&#xff0c;并探讨它们在数据分析中的作用。 一 OLAP工具的分类 在选…...

xml重点笔记(尚学堂 3h)

XML:可扩展标记语言 主要内容(了解即可) 1.XML介绍 2.DTD 3.XSD 4.DOM解析 6.SAX解析 学习目标 一. XML介绍 1.简介 XML(Extensible Markup Language) 可扩展标记语言&#xff0c;严格区分大小写 2.XML和HTML XML是用来传输和存储数据的。 XML多用在框架的配置文件…...

爬虫代理API的全面解析:让数据抓取更高效

在大数据时代&#xff0c;网络爬虫已经成为收集和分析数据的重要工具。然而&#xff0c;频繁的请求会导致IP被封禁&#xff0c;这时候爬虫代理API就显得尤为重要。本文将详细介绍爬虫代理API的作用、优势及如何使用&#xff0c;帮助你更高效地进行数据抓取。 什么是爬虫代理AP…...

PCL 点云中的植被信息提取(C++详细过程版)

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接,首发于:2024年9月18日。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的抄袭狗。 一、算法原理 1、原理概述 点云具有丰富的色彩信息,可以与植被指数结合使…...

requests-html的具体使用方法有哪些?

‌requests-html是一个功能强大的Python库&#xff0c;用于发送HTTP请求和解析HTML内容。它的使用方法包括安装库、基本使用、发送带有参数的请求、图片抓取实战案例、解析网页内容、执行JavaScript代码、使用CSS选择器来查找元素、继续跟踪链接并获取内容等。‌ ‌安装request…...

YOLOv9改进策略【卷积层】| AKConv: 具有任意采样形状和任意参数数量的卷积核

一、本文介绍 本文记录的是利用AKConv优化YOLOv9的目标检测网络模型。标准卷积操作的卷积运算局限于局部窗口&#xff0c;无法捕获其他位置的信息&#xff0c;且采样形状固定&#xff0c;无法适应不同数据集和位置中目标形状的变化。而AKConv旨在为卷积核提供任意数量的参数和…...

图神经网络池化方法

图神经网络池化方法 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 图神经网络池化方法前言一、扁平图池化二、分层图池化1.节点聚类池化2.节点丢弃池化 参考文献 前言 图池化操作根据其池化策略的差异&#xff…...

小琳AI课堂:确保大语言模型安全的八大策略--从数据隐私到用户教育

大家好&#xff0c;这里是小琳AI课堂。今天我们深入探讨如何保证大语言模型的安全&#xff0c;这可是关系到我们每个人哦&#xff01;&#x1f510; 首先&#xff0c;我们要明白&#xff0c;保证大语言模型的安全&#xff0c;需要从多个方面入手&#xff0c;确保模型在技术、法…...

Python 数学建模——高斯核密度估计

文章目录 前言原理代码实例scipy 实现seaborn 实现 前言 高斯核密度估计本是一种机器学习算法&#xff0c;在数学建模中也可以发挥作用。本文主要讨论用它来拟合变量的概率密度&#xff0c;获得概率密度函数 f ( x ) f(x) f(x)。 原理 已知一个连续型随机变量 X X X 的一系列…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露&#xff0c;数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据&#xff0c;严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能&#xff0c;但SEMR…...

webpack面试题

面试题&#xff1a;webpack介绍和简单使用 一、webpack&#xff08;模块化打包工具&#xff09;1. webpack是把项目当作一个整体&#xff0c;通过给定的一个主文件&#xff0c;webpack将从这个主文件开始找到你项目当中的所有依赖文件&#xff0c;使用loaders来处理它们&#x…...

npm安装electron下载太慢,导致报错

npm安装electron下载太慢&#xff0c;导致报错 背景 想学习electron框架做个桌面应用&#xff0c;卡在了安装依赖&#xff08;无语了&#xff09;。。。一开始以为node版本或者npm版本太低问题&#xff0c;调整版本后还是报错。偶尔执行install命令后&#xff0c;可以开始下载…...

Ray框架:分布式AI训练与调参实践

Ray框架&#xff1a;分布式AI训练与调参实践 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 Ray框架&#xff1a;分布式AI训练与调参实践摘要引言框架架构解析1. 核心组件设计2. 关键技术实现2.1 动态资源调度2.2 …...