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

GDPU unity游戏开发 碰撞器与触发器

砰砰叫,谁动了她的奶酪让你的小鹿乱撞了。基于此,亦即碰撞与触发的过程。

碰撞器与触发器的区别

通俗点讲,碰撞器检测碰撞,触发器检测触发,讲了跟没讲似的。碰撞器是用来检测碰撞事件的,在unity中,两个物体能检测到碰撞的前提是两个物体都有碰撞器,且至少有一个是刚体,在引擎中,很多时候都用到了碰撞与交互。 而触发器是碰撞器的一种,一旦勾选了触发器就检测不到碰撞了,这就是碰撞器与触发器的主要区别,触发器可以实现很多物体之间产生的交互效果,而不想用碰撞检测即两物体是穿透的。就比如你跟你的npy擦肩而过,念念不忘是不是一种触发,你跟ta刚好碰到的那一刻脸红了是不是一种碰撞。物体间触发过程能产生一些事件,而碰撞过程就不只是会产生一些事件,还有物体间的接触。 

碰撞小球与触发小球 

实验内容:

1. 新建工程,导入附件中的资源包“Physics.unitypackage”,打开场景physics,场景可以实现通过键盘控制绿色小球左右移动。尝试理解脚本GroundMove和BallController的逻辑,并给脚本加上注释。

2. 在Unity的资源商店中下载一个免费的音频资源并导入到工程中。

3. 在场景中的地板增加若干球体、立方体,通过调整球体和立方体的属性,使得部分物体可碰撞,部分物体可触发。移动绿色小球来拦截这些物体,使得碰撞时通过OnCollisionEnter播放一种音效,并销毁被碰撞的物体;经过可触发对象时通过OnTriggerEnter播放另一种音效,并将该物体的颜色改为红色。

4. 选做:给地板增加贴图、给游戏增加UI来记录碰撞的次数和触发的次数。

提示:

  1)给小球增加声音组件,component->audio->audio source,并实现音频播放功能。

  2)将两个不同的声音片段分别拖到Inspector面板中脚本的SC_Sound和E_Sound处。

  3)后面增加的球体、立方体等根据需要增加刚体组件并调整isTrigger属性、重力属性等相关属性。

  4)给小球的脚本增加相关的事件处理函数。

先导入资源包,然后观察刚体与碰撞体。注意一下,碰撞检测中的至少一个是刚体指的是普通刚体碰撞体。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class GroundMove : MonoBehaviour
{public float moveSpeed = 5f;//控制地板移动的速度private Vector3 startPos;void Start(){startPos = transform.position;//地板的初始位置}void FixedUpdate(){// 地板向摄像机方向移动transform.Translate(Vector3.back * moveSpeed * Time.deltaTime);//往后移,即z轴负方向// 如果地板移出摄像机视野范围,则重新生成在起始位置if (transform.position.z < Camera.main.transform.position.z)//检查地板是否移出了摄像机的视野范围{transform.position = startPos;//循环移动}}
}
using UnityEngine;public class BallController : MonoBehaviour
{public float moveSpeed = 5f;//控制球体的移动速度,并设置默认值为5public float maxDistance = 2.4f;//限制球体移动的最大距离,并设置默认值为2.4void FixedUpdate(){float moveInput = Input.GetAxis("Horizontal");//获取水平方向上的输入,表示左右方向键的按下情况//根据水平输入、移动速度和时间间隔计算出球体应该移动到的目标位置。Vector3 targetPosition = transform.position + Vector3.right * moveInput * moveSpeed * Time.deltaTime;//限制目标位置的x轴坐标在 - maxDistance到maxDistance之间,以确保球体不会超出指定的最大移动距离。targetPosition.x = Mathf.Clamp(targetPosition.x, -maxDistance, maxDistance);transform.position = targetPosition;//球体的位置设置为目标位置,实现球体的水平移动。}
}

 通过这些代码可以控制小球在一个地面运动,到达一定距离时回到原来位置重新移动。然后在场景中加多几个方块与球体对象作障碍物实现碰撞检测与触发检测。

这里记得要选好预制体,要不调参时就得点到手疼了。 选合适的纹理进行颜色贴图,然后找音频资源导入,给运动的小球加脚本等相关的配置。

你可能会遇到物体被撞飞发生形变的状况,那要是想碰撞使方块改变颜色而不产生形变怎么办,这里可以用刚体约束。

把它定在原地。 

这里主要编写的碰撞触发代码,这里用了碰撞去销毁,触发去改变颜色。然后勾选触发器时,刚体默认是启用重力的,想一下如果没有碰撞盒是不是就会往下掉了,因此在触发器的物体把启用重力去掉即可。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Ent : MonoBehaviour
{public AudioClip collisionSound;public AudioClip triggerSound;private int collisioncnt=0;private int triggercnt=0;private AudioSource audioSource;private void Start(){// 获取 AudioSource 组件audioSource = GetComponent<AudioSource>();//this.GetComponent}IEnumerator UI_Update(){yield return new WaitForSeconds(0.5f);//让程序等待 0.5 秒钟,然后再继续执行协程中的下一条语句}private void OnCollisionEnter(Collision collision){Debug.Log("与"+collision.gameObject.name+"发生碰撞");audioSource.clip = collisionSound;audioSource.Play();if (collision.gameObject.CompareTag("Cube")){//调用父类中的销毁函数销毁触碰到的对象物体collisioncnt++;Destroy(collision.gameObject);StartCoroutine("UI_Update");//启动UI_Update协程UIEnt._instance.SetText(collisioncnt, triggercnt);}}private void OnCollisionStay(Collision collision){collision.gameObject.GetComponent<MeshRenderer>().material.color = Color.red;Debug.Log("与" + collision.gameObject.name + "处于碰撞");}private void OnCollisionExit(Collision collision){Debug.Log("与" + collision.gameObject.name + "碰撞解除");this.gameObject.GetComponent<MeshRenderer>().material.color = Color.green;}private void OnTriggerEnter(Collider other){Debug.Log(other.gameObject.name + "进入触发区域");this.gameObject.GetComponent<MeshRenderer>().material.color = Color.blue;audioSource.clip = triggerSound;audioSource.Play();//调用父类中的销毁函数销毁触碰到的对象物体triggercnt++;StartCoroutine("UI_Update");//启动UI_Update协程UIEnt._instance.SetText(collisioncnt,triggercnt);}private void OnTriggerStay(Collider other){Debug.Log(other.gameObject.name + "处于碰撞区域");other.gameObject.GetComponent<MeshRenderer>().material.color = Color.red;}private void OnTriggerExit(Collider other){Debug.Log(other.gameObject.name + "离开触发区域"+ triggercnt);other.gameObject.GetComponent<MeshRenderer>().material.color = Color.yellow;this.gameObject.GetComponent<MeshRenderer>().material.color = Color.green;}}

这里的碰撞与触发检测的方法还是比较重要的,然后写脚本要记得找准对象的组件元素。接着写一个ui界面来记录碰撞的次数和触发的次数。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class UIEnt : MonoBehaviour
{//单例模式,保证实例的唯一性。public static UIEnt _instance;public Text countText;public int initCount;//在游戏对象被实例化时调用,将当前实例赋值给私有变量 _instanceprivate void Awake(){_instance = this;}//在脚本启动时调用,初始化了几个文本框的文本内容void Start(){//初始化设置Text文本框countText.text = "Count:" + initCount.ToString();}//当玩家触碰到Cube对象时可以被调用public void SetText(int colcnt,int tricnt){countText.text = "碰撞次数: " + colcnt.ToString()+"     触发次数: " + tricnt.ToString();}}

多调试几次,你就会明白碰撞与触发的区别了。

 

实验心得 

假期了,你负责玩,我负责写,安全感还是要有的。

相关文章:

GDPU unity游戏开发 碰撞器与触发器

砰砰叫&#xff0c;谁动了她的奶酪让你的小鹿乱撞了。基于此&#xff0c;亦即碰撞与触发的过程。 碰撞器与触发器的区别 通俗点讲&#xff0c;碰撞器检测碰撞&#xff0c;触发器检测触发&#xff0c;讲了跟没讲似的。碰撞器是用来检测碰撞事件的&#xff0c;在unity中&#xff…...

IP地址定位技术在网络安全中的作用

在当今数字化时代&#xff0c;网络安全已经成为企业、政府和个人面临的重要挑战之一。随着互联网的普及和网络攻击的增加&#xff0c;保护个人隐私和防止网络犯罪变得尤为重要。在这一背景下&#xff0c;IP地址定位技术作为网络安全的重要组成部分之一&#xff0c;发挥着关键作…...

R语言中,查看经安装的包,查看已经加载的包,查看特定包是否已经安装,安装包,更新包,卸载包

创建于&#xff1a;2024.5.4 R语言中&#xff0c;查看经安装的包&#xff0c;查看已经加载的包&#xff0c;查看特定包是否已经安装&#xff0c;安装包&#xff0c;更新包&#xff0c;卸载包 文章目录 1. 查看经安装的包2. 查看已经加载的包3. 查看特定包是否已经安装4. 安装包…...

spring boot3单模块项目工程搭建-下(个人开发模板)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 目录 写在前面 上文衔接 常用依赖介绍以及整合 web组件 测试组件 样板代码生成 数据库连接器 常用工具包 面向切面编程 ORM框架 数据连接池 接口测试、文档导出 缓存中间件 参数校…...

精准清理 MongoDB 数据:删除集合的正确姿势

在 MongoDB 数据库管理中&#xff0c;数据清理是维护数据库性能和保持数据一致性的关键步骤之一。而删除集合是实现数据清理的重要手段之一。在这个信息爆炸的时代&#xff0c;了解如何正确地执行集合删除操作至关重要。本文将深入探讨 MongoDB 中删除集合的常用方法、最佳实践…...

java 执行修改语句

你可以使用Java中的JDBC&#xff08;Java Database Connectivity&#xff09;来执行修改语句。以下是一个示例&#xff1a; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement;public class Main {public…...

【Linux系统化学习】网络套接字(编写简单的UDP服务端和客户端)

目录 理解源IP地址和目的IP地址 认识端口号 端口号和进程ID的区别 源端口号和目的端口号 认识TCP和UDP协议 TCP协议 UDP协议 网络字节序 socket编程接口 socket常见API sockaddr结构 简单的UDP网络程序 UDP服务端 创建套接字 填充本地网络信息 绑定 收取消息 …...

MFC 列表控件修改实例(源码下载)

1、本程序基于前期我的博客文章《MFC下拉菜单打钩图标存取实例&#xff08;源码下载&#xff09;》 2、程序功能选中列表控件某一项&#xff0c;修改这一项的按钮由禁止变为可用&#xff0c;双击这个按钮弹出对话框可对这一项的记录数据进行修改&#xff0c;点击确定保存修改数…...

QT设计模式:模板模式

基本概念 模板模式&#xff08;Template Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一个操作中的算法的模板&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。 实现的模块有&#xff1…...

8.k8s中网络资源service

目录 一、service资源概述 二、service资源类型 1.ClusterIP类型 2.service的nodeport类型 3.service的loadbalancer类型&#xff08;了解即可&#xff09; 4.service的externalname类型&#xff08;了解即可&#xff09; 三、nodeport的端口范围设置和svc的endpoint列表 1.修…...

51单片机keil编程中遇到的问题(持续更新)

字符无法打印报错 查看特殊功能寄存器名字的时候也会报错&#xff0c;因为无法编译通过&#xff0c;导致头文件的定义内容无法查找 keil编译中 error C127: ‘xx’: invalid storage class 这种一般是在编写头文件或源文件时&#xff0c;在声明函数的结尾没有添加分号&…...

C++类和对象详解(一)

目录 面向过程和面向对象初步认识类的引入类的定义类的两种定义方式声明和定义全部放在类体中 声名定义分离 类的作用域成员变量命名规则建议访问限定符 类的封装类的实例化类对象模型类的对象大小的计算扩展 结构体内存对齐规则 感谢各位大佬对我的支持,如果我的文章对你有用,…...

SCI论文检索报告长什么样?怎么出具?一文了解!

1、SCI检索报告是什么 SCI数据库收录最能反映基础学科研究水平和论文质量&#xff0c;该检索系统收录的科技期刊比较全面&#xff0c;可以说它是集中各个学科高质优秀论文的精粹&#xff0c;评职晋升、项目申报、评奖评优等很多关键时期&#xff0c;都需要开具已经在SCI发表的论…...

UE4_Water插件_Buoyancy组件使用

water插件提供了一个浮力Actor蓝图类。 需要注意的几个问题: 1、StaticMesh需要替换根组件。 2、需要模拟物理设置质量。 3、需要添加浮力组件,设置浮力点,应用水中牵引力。...

OceanBase学习1:分布式数据库与集中式数据库的差异

目录 1. 传统集中式数据库 2. 数据库中间件的分库分表 3. 分布式数据库的基本特点及对比分析 4. OceanBase和传统数据库的对比 5. 小结 1. 传统集中式数据库 优点 成熟稳定:经过近40年的发展&#xff0c;应用到各行各业&#xff0c;产品技术非常成熟稳定行业适配性强:适配…...

计算机网络技术主要学什么内容,有哪些课程

计算机网络技术专业是一个涉及理论与实践紧密结合的学科&#xff0c;主要学习内容有计算机网络基础、网络设备技术、网络编程等内容&#xff0c;以下是上大学网&#xff08;www.sdaxue.com&#xff09;整理的计算机网络技术主要学什么内容&#xff0c;供大家参考&#xff01; 基…...

Mac下安装ffmpeg

1、安装gedit brew install gedit2、配置环境变量&#xff0c;打开~/.zshrc&#xff0c;在末尾添加语句 export PATH$PATH:/usr/local/ffmpeg/bin3、执行语句&#xff0c;使环境变量生效 source ~/.zshrc 4、终端输入 ffmpeg &#xff0c;看环境变量是否配置成功。 至此&a…...

自制AI:Park_01修改bug

修改了一下不能存东西&#xff0c;不能打开东西的bug #include<bits/stdc.h> #include<windows.h> using namespace std; double mem10737418240; map<string,string> jishiben; string mulu"朴同学给你的一封信.memo\n"; int cntnote1; void sta…...

解救应用启动危机:Spring Boot的FailureAnalyzer机制

目录 一、走进FailureAnalyzer 二、在Spring Boot中如何生效 三、为什么可能需要自定义FailureAnalyzer 四、实现自定义基本步骤 &#xff08;一&#xff09;完整步骤要求 &#xff08;二&#xff09;注册方式说明 通过Spring Boot的spring.factories文件&#xff08;建…...

win11个性化锁屏界面怎么关闭?

win11个性化锁屏界面关闭方法对于win11用户来说&#xff0c;关闭个性化锁屏界面是一个常见问题。本文将由php小编苹果详细介绍如何执行此操作&#xff0c;分步指导并提供操作截图。继续阅读以了解具体步骤。 win11个性化锁屏界面关闭方法 第一步&#xff0c;点击底部Windows图…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...