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游戏开发 碰撞器与触发器
砰砰叫,谁动了她的奶酪让你的小鹿乱撞了。基于此,亦即碰撞与触发的过程。 碰撞器与触发器的区别 通俗点讲,碰撞器检测碰撞,触发器检测触发,讲了跟没讲似的。碰撞器是用来检测碰撞事件的,在unity中ÿ…...

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

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

spring boot3单模块项目工程搭建-下(个人开发模板)
⛰️个人主页: 蒾酒 🔥系列专栏:《spring boot实战》 目录 写在前面 上文衔接 常用依赖介绍以及整合 web组件 测试组件 样板代码生成 数据库连接器 常用工具包 面向切面编程 ORM框架 数据连接池 接口测试、文档导出 缓存中间件 参数校…...
精准清理 MongoDB 数据:删除集合的正确姿势
在 MongoDB 数据库管理中,数据清理是维护数据库性能和保持数据一致性的关键步骤之一。而删除集合是实现数据清理的重要手段之一。在这个信息爆炸的时代,了解如何正确地执行集合删除操作至关重要。本文将深入探讨 MongoDB 中删除集合的常用方法、最佳实践…...
java 执行修改语句
你可以使用Java中的JDBC(Java Database Connectivity)来执行修改语句。以下是一个示例: 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下拉菜单打钩图标存取实例(源码下载)》 2、程序功能选中列表控件某一项,修改这一项的按钮由禁止变为可用,双击这个按钮弹出对话框可对这一项的记录数据进行修改,点击确定保存修改数…...
QT设计模式:模板模式
基本概念 模板模式(Template Pattern)是一种行为型设计模式,它定义了一个操作中的算法的模板,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。 实现的模块有࿱…...

8.k8s中网络资源service
目录 一、service资源概述 二、service资源类型 1.ClusterIP类型 2.service的nodeport类型 3.service的loadbalancer类型(了解即可) 4.service的externalname类型(了解即可) 三、nodeport的端口范围设置和svc的endpoint列表 1.修…...

51单片机keil编程中遇到的问题(持续更新)
字符无法打印报错 查看特殊功能寄存器名字的时候也会报错,因为无法编译通过,导致头文件的定义内容无法查找 keil编译中 error C127: ‘xx’: invalid storage class 这种一般是在编写头文件或源文件时,在声明函数的结尾没有添加分号&…...

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

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

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

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

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

Mac下安装ffmpeg
1、安装gedit brew install gedit2、配置环境变量,打开~/.zshrc,在末尾添加语句 export PATH$PATH:/usr/local/ffmpeg/bin3、执行语句,使环境变量生效 source ~/.zshrc 4、终端输入 ffmpeg ,看环境变量是否配置成功。 至此&a…...
自制AI:Park_01修改bug
修改了一下不能存东西,不能打开东西的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 四、实现自定义基本步骤 (一)完整步骤要求 (二)注册方式说明 通过Spring Boot的spring.factories文件(建…...

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

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...