当前位置: 首页 > 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…...

精确管理Python项目依赖:自动生成requirements.txt的智能方法

在Python中&#xff0c;可以使用几种方法来自动生成requirements.txt文件。这个文件通常用于列出项目所需的所有依赖包及其版本&#xff0c;使其他人或系统可以轻松地重现相同的环境。下面是几种常见的方法&#xff1a; 使用pip freeze&#xff1a; 这是最常见的方法。pip free…...

JavaWeb基础(1)- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件监听、正则表达式)

JavaWeb基础&#xff08;1&#xff09;- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件监听、正则表达式) 文章目录 JavaWeb基础&#xff08;1&#xff09;- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件…...

java SSM体育器材租借管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM体育器材租借管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要…...

西电期末1030.函数的最大值

一.题目 二.分析与思路 函数打擂台&#xff0c;注意数据类型和保留精度 三.代码实现 #include<bits/stdc.h>//万能头 double f(double x,double a){return a*x*x-x*x*x; }//f(x) int main() {double a;scanf("%lf",&a);double max-1000001;//打擂台for(…...

在Docker中安装Tomact

目录 前言&#xff1a; 一.安装Tomact 查找指定的tomact版本 下载tomact9.0 查看该镜像是否安装成功 安装成功之后就开始运行镜像了 ps&#xff08;用于列出正在运行的Docker容器&#xff09; ​编辑 测试(虚拟机ip:8080) ​编辑 解决措施 ​编辑 完成以上步骤&…...

【书生大模型00--开源体系介绍】

书生大模型开源体系介绍 0 通用人工智能1 InternLM性能及模型2 从模型到应用 大模型成为目前很热的关键词&#xff0c;最热门的研究方向&#xff0c;热门的应用&#xff1b;ChatGPT的横空出世所引爆&#xff0c;快速被人们上手应用到各领域&#xff1b; 0 通用人工智能 相信使…...

基于GPT-3、ChatGPT、GPT-4等Transformer架构的自然语言处理

文章目录 一、内容简介二、前言2.1 Transformer 模型标志着AI 新时代的开始2.2 Transformer 架构具有革命性和颠覆性2.3 Google BERT 和OpenAI GPT-3 等Transformer 模型将AI 提升到另一个层次2.4 本书将带给你的“芝士”2.5 本书面向的读者 三、本书内容简介3.1 第一章3.2 第二…...

一款开源的MES系统

随着工业4.0的快速发展&#xff0c;制造执行系统&#xff08;MES&#xff09;成为了智能制造的核心。今天&#xff0c;将为大家推荐一款开源的MES系统——iMES工厂管家。 什么是iMES工厂管家 iMES工厂管家是一款专为中小型制造企业打造的开源MES系统。它具备高度的可定制性和灵…...

https配置证书

HTTPS 基本原理 https 介绍 HTTPS&#xff08;全称&#xff1a;HyperText Transfer Protocol over Secure Socket Layer&#xff09;&#xff0c;其实 HTTPS 并不是一个新鲜协议&#xff0c;Google 很早就开始启用了&#xff0c;初衷是为了保证数据安全。 国内外的大型互联网…...

图神经网络|10.4 GCN 变换原理的解读

由9.3-邻接矩阵的变换可知&#xff0c;理解矩阵通过两个度矩阵的逆进行归一化。 微观上看&#xff0c; a i j a_{ij} aij​这个元素将会乘上 1 d e g ( v i ) d e g ( v j ) \frac{1}{\sqrt{deg_(v_i)\sqrt{deg(v_j)}}} deg(​vi​)deg(vj​) ​ ​1​ 其现实意义如下—— 比如…...

国家税务总局网上怎样领发票/seo岗位是什么意思

社团展望未来演讲稿范文(四)回顾过去&#xff0c;成功或汗水都随时间流逝成为过去&#xff0c;展望新一年我们意气风发。心缘诗社为了能够在学期末&#xff0c;通过交流更好的了解社团&#xff0c;发展社团。2013年12月22日中午12:00于弘雷楼201室举办了社团总结大会。此次大会…...

php服装网站模板/webview播放视频

21. 为集群安装 Oracle Grid Infrastructure 仅在集群的一个 Oracle RAC 节点 (racnode1) 上执行以下安装过程。Oracle Universal Installer 将把 Oracle Grid Infrastructure 软件&#xff08;Oracle Clusterware 和自动存储管理&#xff09;安装到集群中的两个 Or…...

台州做网站比较好的有哪些/本周热点新闻事件

bpf 指令用于过滤逻辑 &#xff08;filter program&#xff09; 是有一个指令数组表示。 只有向前跳转 ret指令结束过滤 每一个指令操作 bpf虚拟机的内部状态 包括 累加器:accumulator, 指示器&#xff1a;index register, bpf内存&#xff1a;memory store, pc 程序指针:…...

建网站的公司不肯签合同/优化大师免费版

对于vs2013来讲&#xff0c; 步骤&#xff1a; 1.VS2013 中找到&#xff08;安装盘符以C盘为例&#xff09;C:\ProgramFiles(x86)\Microsoft VisualStudio12.0\Common7\IDE\ItemTemplatesCache\CSharp\Code\2052\Class Code文件夹指类代码&#xff0c; 2052文件夹下的每个文件的…...

建设公司网站账务处理/百度 seo优化作用

1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件。 该程序正常执行流程是&#xff1a;main调用foo函数,foo函数会简单回显任何用户输入的字符串。 该程序同时包含另一个代码片段&#xff0c;getShell&#xff0c;会返回一个可用Shell。正…...

wordpress如何修改主题名称/淄博头条新闻今天

CNS解决方案现在已集成了Expect自动化脚本配置和指令下发功能&#xff0c;可以大量替换原有网管人员对交换机频繁配置所带来的不变。Expect是进行高效的系统和网络管理工作不可或缺的一种工具&#xff0c;如果您从事系统和网络管理工作&#xff0c;那么您将需要 Expect。在本文…...