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

Unity组件开发--升降梯

        我开发的升降梯由三个部分组成,反正适用于我的需求了,其他人想复用到自己的项目的话,不一定。写的也不是很好,感觉搞的有点复杂啦。完全可以在优化一下,项目赶工期,就先这样吧。能用就行,其他的再说。

1.升降梯基类:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public abstract class LiftObjCtrBase : MonoBehaviour
{public float speed = 5f;  // 上升和下降的速度public LiftObjCtrBase targetObject;  // 指定的物体高度[HideInInspector]public bool isRising = false;  // 是否正在上升[HideInInspector]public bool isFalling = false;  // 是否正在下降[HideInInspector]public bool isPlayerStay = false; //玩家是否在上面[HideInInspector]public Vector3 initialPosition;  // 初始位置[HideInInspector]public float offsetY = 0;[HideInInspector]public Transform playerTra;[HideInInspector]public Transform targetTra;[HideInInspector]public float radius = 0;// Start is called before the first frame update[HideInInspector]public bool isReach = false;public virtual bool isTriggerEnter(Transform playerTra) {if (Vector3.Distance(gameObject.transform.position, playerTra.position) > radius){return false;}else{return true;}}public virtual void startRising() {}}

2.玩家接触到的头一个升降梯:第一个升降梯的碰撞组件,必须开启isTrigger属性;注意:所有升降梯都需要挂碰撞组件

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.TextCore.Text;public class LiftFirstObjCtr : LiftObjCtrBase
{//private Transform player;  // 角色private void Start(){initialPosition = transform.position;  // 记录初始位置targetTra = targetObject.gameObject.transform;MeshCollider meshCollider = gameObject.GetComponent<MeshCollider>();radius = meshCollider.bounds.extents.magnitude;}private void Update(){if (targetObject == null) return;if (playerTra != null && !isTriggerEnter(playerTra) && !isFalling){isPlayerStay = false;isFalling = true;isRising = false;}if (playerTra !=null && targetObject.isTriggerEnter(playerTra) && !targetObject.isRising && !targetObject.isReach){isPlayerStay = false;isFalling = true;targetObject.startRising();}if (isRising && isPlayerStay){// 上升逻辑if (playerTra == null || offsetY == 0) return;transform.Translate(Vector3.up * speed * Time.deltaTime);playerTra.position = new Vector3(playerTra.position.x, transform.position.y+ offsetY+0.4f, playerTra.position.z);// 到达目标高度后开始下降if (transform.position.y >= targetTra.position.y){gameObject.GetComponent<Collider>().isTrigger = false;isRising = false;}}else if (isFalling && !isPlayerStay){// 下降逻辑transform.Translate(Vector3.down * speed * Time.deltaTime);// 返回初始位置后停止下降if (transform.position.y <= initialPosition.y){transform.position = initialPosition;isFalling = false;gameObject.GetComponent<Collider>().isTrigger = true;}}}private void OnTriggerEnter(UnityEngine.Collider other){if (other.gameObject.tag == "Player"){Debug.Log("玩家撞到升降梯");}}public override bool isTriggerEnter(Transform playerTra) {// 检测角色是否在碰撞器范围内if (Vector3.Distance(gameObject.transform.position, playerTra.position) > radius){return false;}else {return true;}}private void OnTriggerStay(UnityEngine.Collider other){if (other.gameObject.tag == "Player" && !isPlayerStay){if (Vector3.Distance(other.gameObject.transform.position, gameObject.transform.position)< radius) {Debug.Log("玩家待在升降梯");isRising = true;playerFollow(other.gameObject);gameObject.GetComponent<Collider>().isTrigger = false;}}}private void OnTriggerExit(UnityEngine.Collider other){}private void playerFollow(GameObject player) {offsetY = player.transform.position.y - transform.position.y;playerTra = player.transform;isPlayerStay = true;}public override void startRising(){}
}

3.中间的其他升降梯,其他中间的升降梯由于是悬浮在空中的,所以需要不能开启isTrigger属性,否则玩家碰到后就会掉下去:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.TextCore.Text;public class LiftMiddleObjCtr : LiftObjCtrBase
{public LiftObjCtrBase preLiftObj;// Update is called once per frameprivate void Start(){initialPosition = transform.position;  // 记录初始位置targetTra = targetObject.transform;MeshCollider meshCollider = gameObject.GetComponent<MeshCollider>();radius = meshCollider.bounds.extents.magnitude;}void Update(){if (targetObject == null) return;if (playerTra != null && !isTriggerEnter(playerTra) && !isFalling){isPlayerStay = false;isFalling = true;isRising = false;return;}if (playerTra != null && targetObject.isTriggerEnter(playerTra) && !targetObject.isRising){isPlayerStay = false;isFalling = true;targetObject.startRising();playerTra = null;}if (isRising && isPlayerStay){// 上升逻辑if (playerTra == null || offsetY == 0) return;transform.Translate(Vector3.up * speed * Time.deltaTime);playerTra.position = new Vector3(playerTra.position.x, transform.position.y + offsetY + 0.4f, playerTra.position.z);// 到达目标高度后开始下降if (transform.position.y >= targetTra.position.y){isRising = false;isReach = true;}}else if (isFalling && !isPlayerStay){// 下降逻辑transform.Translate(Vector3.down * speed * Time.deltaTime);// 返回初始位置后停止下降if (transform.position.y <= initialPosition.y){transform.position = initialPosition;isFalling = false;isReach = false;isRising = false;}}}public override bool isTriggerEnter(Transform playerTra){if (Vector3.Distance(gameObject.transform.position, playerTra.position) > radius){return false;}else{return true;}}public override void startRising() {isRising = true;playerFollow(preLiftObj.playerTra.gameObject);gameObject.GetComponent<Collider>().isTrigger = false;}private void playerFollow(GameObject player){offsetY = player.transform.position.y - transform.position.y;playerTra = player.transform;isPlayerStay = true;}
}

4.最后一个升降梯,是玩家最终达到的升降梯,所以可以不用升降,他是出发倒数第二个升降梯的下降:感觉有点奇怪,反正整个组件都开发的感觉奇奇怪怪的,算了算了,咱也没啥要求,混口饭吃,能较差就行

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class LiftLastObjCtr : LiftObjCtrBase
{// Start is called before the first frame updatepublic LiftMiddleObjCtr middleObject;public override bool isTriggerEnter(Transform playerTra){return false;}public override void startRising(){}// Update is called once per framevoid Update(){if (middleObject != null && middleObject.playerTra != null) {if (Vector3.Distance(middleObject.playerTra.position,gameObject.transform.position) < 1) {if (Vector3.Distance(middleObject.playerTra.position, middleObject.gameObject.transform.position) > 1){middleObject.isFalling = true;middleObject.isPlayerStay = false;}}}}}

相关文章:

Unity组件开发--升降梯

我开发的升降梯由三个部分组成&#xff0c;反正适用于我的需求了&#xff0c;其他人想复用到自己的项目的话&#xff0c;不一定。写的也不是很好&#xff0c;感觉搞的有点复杂啦。完全可以在优化一下&#xff0c;项目赶工期&#xff0c;就先这样吧。能用就行&#xff0c;其他的…...

插槽slot涉及到的样式污染问题

1. 前言 本次我们主要结合一些案例研究一下vue的插槽中样式污染问题。在这篇文章中&#xff0c;我们主要关注以下两点: 父组件的样式是否会影响子组件的样式&#xff1f;子组件的样式是否会影响父组件定义的插槽部分的样式&#xff1f; 2. 准备代码 2.1 父组件代码 <te…...

OpenCV-Python(25):Hough直线变换

目标 理解霍夫变换的概念学习如何在一张图片中检测直线学习函数cv2.HoughLines()和cv2.HoughLinesP() 原理 霍夫变换在检测各种形状的的技术中非常流行。如果你要检测的形状可以用数学表达式写出来&#xff0c;你就可以是使用霍夫变换检测它。即使检测的形状存在一点破坏或者…...

python接口自动化(七)--状态码详解对照表(详解)

1.简介 我们为啥要了解状态码&#xff0c;从它的作用&#xff0c;就不言而喻了。如果不了解&#xff0c;我们就会像个无头苍蝇&#xff0c;横冲直撞。遇到问题也不知道从何处入手&#xff0c;就是想找别人帮忙&#xff0c;也不知道是找前端还是后端的工程师。 状态码的作用是&a…...

Android 实现动态申请各项权限

在Android应用中&#xff0c;如果需要使用一些敏感的权限&#xff08;例如相机、位置等&#xff09;&#xff0c;需要经过用户的授权才能访问。在Android 6.0&#xff08;API级别23&#xff09;及以上的版本中&#xff0c;引入了动态权限申请机制。以下是在Android应用中实现动…...

【leetcode】力扣热门之合并两个有序列表【简单难度】

题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 用例 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[] 输入&#xff1a;l1 []…...

安全与认证Week3 Tutorial+历年题补充

目录 1) 什么是重放攻击? 2)什么是Kerberos系统?它提供什么安全服务? 3)服务器验证客户端身份的一种简单方法是要求提供密码。在Kerberos中不使用这种身份验证&#xff0c;为什么?Kerberos如何对服务器和客户机进行身份验证? 4) Kerberos的四个要求是什么?Kerberos系…...

【Kotlin】协程

Kotlin协程 背景定义实践GlobalScope.launchrunBlocking业务实践 背景 在项目实践过程中&#xff0c;笔者发现很多异步或者耗时的操作&#xff0c;都使用了Kotlin中的协程&#xff0c;所以特地研究了一番。 定义 关于协程&#xff08;Coroutine&#xff09;&#xff0c;其实…...

Scikit-Learn线性回归(五)

Scikit-Learn线性回归五:岭回归与Lasso回归 1、误差与模型复杂度2、范数与正则化2.1、范数2.2、正则化3、Scikit-Learn Ridge回归(岭回归)4、Scikit-Learn Lasso回归1、误差与模型复杂度 在第二篇文章 Scikit-Learn线性回归(二) 中,我们已经给出了过拟合与模型泛化的概念并…...

React(2): 使用 html2canvas 生成图片

使用 html2canvas 生成图片 需求 将所需的内容生成图片div 中包括 svg 等 前置准备 "react": "^18.2.0","react-dom": "^18.2.0","html2canvas": "^1.4.1",实现 <div ref{payRef}></div>const pa…...

CAN物理层协议介绍

目录 ​编辑 1. CAN协议简介 2. CAN物理层 3. 通讯节点 4. 差分信号 5. CAN协议中的差分信号 1. CAN协议简介 CAN是控制器局域网络(Controller Area Network)的简称,它是由研发和生产汽车电子产品著称的德国BOSCH公司开发的,并最终成为国际标准(ISO11519) &#xff0…...

华为OD机试真题-计算面积-2023年OD统一考试(C卷)

题目描述: 绘图机器的绘图笔初始位置在原点(0, 0),机器启动后其绘图笔按下面规则绘制直线: 1)尝试沿着横向坐标轴正向绘制直线,直到给定的终点值E。 2)期间可通过指令在纵坐标轴方向进行偏移,并同时绘制直线,偏移后按规则1 绘制直线;指令的格式为X offsetY,表示在横…...

设计模式之策略模式【行为型模式】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某…...

git使用(完整流程)

1. 新建仓库 1.右击 git bash 后 输入 git init (仓库为:当前目录) git init name (仓库为:name文件夹) git clone https://github.com/Winnie996/calculate.git //https2.工作区域 工作目录 3. 添加 提交 git add . //工作区添加至暂存区 git commit -m "注释内容&q…...

九、HTML头部<head>

一、HTML头部<head> 1、<title>- 定义了HTML文档的标题 使用 <title> 标签定义HTML文档的标题 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>我的 HTML 的第一页</title> </head><b…...

机器学习期末复习

机器学习 选择题名词解释&#xff1a;简答题计算题一、线性回归二、决策树三、贝叶斯 选择题 机器学习利用经验 &#xff0c;须对以下&#xff08;&#xff09;进行分析 A 天气 B 数据 C 生活 D 语言 归纳偏好值指机器学习算法在学习的过程中&#xff0c;对以下&#xff08;&a…...

python-日志模块以及实际使用设计

python-日志模块以及实际使用设计 1. 基本组成 日志模块四个组成部分&#xff1a; 日志对象&#xff1a;产生日志信息日志处理器&#xff1a;将日志信息输出到指定地方&#xff0c;例如终端、文件。格式器&#xff1a;在日志处理器输出之前&#xff0c;对信息进行各方面的美化…...

googlecode.log4jdbc慢sql日志,格式化sql

前言 无论使用原生JDBC、mybatis还是hibernate&#xff0c;使用log4j等日志框架可以看到生成的SQL&#xff0c;但是占位符和参数总是分开打印的&#xff0c;不便于分析&#xff0c;显示如下的效果: googlecode Log4jdbc 是一个开源 SQL 日志组件&#xff0c;它使用代理模式实…...

Linux程序、进程和计划任务

目录 一.程序和进程 1.程序的概念 2.进程的概念 3.线程的概念 4.单线程与多线程 5.进程的状态 二.查看进程信息相关命令&#xff1a; 1.ps&#xff1a;查看静态进程信息状态 2.top&#xff1a;查看动态进程排名信息 3.pgrep&#xff1a;查看指定进程 4.pstree&#…...

【MySQL】索引基础

文章目录 1. 索引介绍2. 创建索引 create index…on…2.1 explain2.2 创建索引create index … on…2.3 删除索引 drop index … on 表名 3. 查看索引 show indexes in …4. 前缀索引4.1 确定最佳前缀长度&#xff1a;索引的选择性 5. 全文索引5.1 创建全文索引 create fulltex…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...