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

devtools/2024/9/19 1:51:50/ 标签: unity, 游戏引擎, c#, 游戏程序, 关卡设计

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

碰撞器与触发器的区别

通俗点讲,碰撞器检测碰撞,触发器检测触发,讲了跟没讲似的。碰撞器是用来检测碰撞事件的,在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();}}

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

 

实验心得 

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


http://www.ppmy.cn/devtools/32916.html

相关文章

使用Pytorch中的torchtext加载和预处理文本分类任务的数据集

文章目录 1. torchtext版本&#xff1a;0.15.02. 导入库和模块&#xff1a;3. 定义分词器&#xff1a;3.1 一个简单的示例来进一步说明 get_tokenizer 函数的使用 4. 下载并加载数据集5. 定义词汇表并构建5.1 map() 函数一个简单的map() 函数的例子 5.2 torchtext.vocab.build_…

浅谈ps/2键盘

文章目录 说明基础知识操作系统中断类型工作机制优点应用 CPU对IO设备的轮询机制轮询机制的工作原理轮询机制的特点轮询机制的优、缺点与中断机制的对比 N-Key Roller&#xff08;全键无冲&#xff09;应用领域实现原理技术限制 PS/2接口简介USB设备&PS/2设备的工作机制PS/…

【强训笔记】day8

NO.3 思路&#xff1a;相乘除以最大公约数等于最小公倍数。最小公倍数等于gcd&#xff08;a&#xff0c;a%b&#xff09;递归直到b等于0。 代码实现&#xff1a; #include <iostream> using namespace std;int gcd(int a,int b) {if(b0) return a;return gcd(b,a%b); }…

深入学习Redis(1):Redis内存模型

Redis的五个对象类型 字符串&#xff0c;哈希&#xff0c;列表&#xff0c;集合&#xff0c;有序集合 本节有关redis的内存模型 1.估算redis的内存使用情况 目前内存的价格比较的高&#xff0c;如果对于redis的内存使用情况能够进行计算&#xff0c;就可以选用合适的设备进…

组合总和2(力扣40)

解题思路&#xff1a;因为这里不能有重复的组合&#xff0c;所以采取用下表used来判断其是否在前面出现过&#xff0c;如果出现过就直接跳过&#xff0c;同时判断是树层重复还是树枝重复&#xff0c;如果是树枝重复就不用跳过 具体代码如下&#xff1a; class Solution { pu…

Leetcode—1056. 易混淆数【简单】Plus

2024每日刷题&#xff08;126&#xff09; Leetcode—1056. 易混淆数 &#x1f4a9;山实现代码 class Solution { public:bool confusingNumber(int n) {int arr[10] {0};int notNum 0;int arr2[12] {0};int size 0;while(n) {int x n % 10;arr[x] 1;arr2[size] x;if(…

【一刷《剑指Offer》】面试题 12:打印 1 到最大的 n 位数

力扣对应题目链接&#xff1a;LCR 135. 报数 - 力扣&#xff08;LeetCode&#xff09; 牛客对应题目链接&#xff1a;打印从1到最大的n位数_牛客题霸_牛客网 (nowcoder.com) 一、《剑指Offer》内容 二、分析题目 1、暴力解法 2、用字符串模拟数字加法 首先要考虑当 n 很大时&…

IoTDB 入门教程 基础篇⑦——数据库管理工具 | DBeaver 连接 IoTDB

文章目录 一、前文二、下载iotdb-jdbc三、安装DBeaver3.1 DBeaver 下载3.2 DBeaver 安装 四、安装驱动五、连接数据库六、参考 一、前文 IoTDB入门教程——导读 二、下载iotdb-jdbc 下载地址org/apache/iotdb/iotdb-jdbc&#xff1a;https://maven.proxy.ustclug.org/maven2/o…

【数学建模】矩阵微分方程

一、说明 我相信你们中的许多人都熟悉微分方程&#xff0c;或者至少知道它们。微分方程是数学中最重要的概念之一&#xff0c;也许最著名的微分方程是布莱克-斯科尔斯方程&#xff0c;它控制着任何股票价格。 ​​ 股票价格的布莱克-斯科尔斯模型 微分方程可以由数学中的许多…

MyBatisPlus @TableLogic实现全局自动逻辑删除

一、背景 有一天&#xff0c;小王在编写代码时实现了一个删除操作&#xff0c;但由于测试场景覆盖不全&#xff0c;上线后不慎删除了系统中的部分业务数据。幸运的是&#xff0c;系统已经开启了binlog日志功能&#xff0c;使得我们能够根据日志来恢复这些误删的数据。这一事故…

关于测试用例

目录 一 测试用例介绍 二 写用例的好处 三 不适合写用例的情况 一 测试用例介绍 测试用例由测试来写&#xff0c;编写时间在需求评审和设计评审&#xff08;如有&#xff09;结束后&#xff0c;需求提测前&#xff0c;用例依赖需求文档来编写。一般包含用例标题&#xff0c…

算法提高之二维费用的背包问题

算法提高之二维费用的背包问题 核心思想&#xff1a;二维01背包 每个物品只能用一次 所以是01背包模板用f[j][k] 表示第一维费用不超过V 第二维费用不超过M的方案 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const i…

OneFlow深度学习框原理、用法、案例和注意事项

本文将基于OneFlow深度学习框架&#xff0c;详细介绍其原理、用法、案例和注意事项。OneFlow是由中科院计算所自动化研究所推出的深度学习框架&#xff0c;专注于高效、易用和扩展性强。它提供了一种类似于深度学习库的接口&#xff0c;可以用于构建神经网络模型&#xff0c;并…

R和Python市场篮分析算法及行为分析模型

&#x1f3af;要点 行为数据分析&#xff1a;&#x1f3af;线性统计研究生学业表现&#xff1a;&#x1f58a;绘制测试分数配对图 | &#x1f58a;构建简单线性回归模型&#xff0c;拟合数据 | &#x1f58a;构建多线性回归&#xff0c;三维可视化数据拟合模型 | &#x1f58a…

前端 JS 异常那些事

前言 人无完人&#xff0c;所以代码总会出异常的&#xff0c;异常并不可怕&#xff0c;关键是怎么处理 什么是异常 程序发生了意想不到的情况&#xff0c;影响到了程序的正确运行 从根本上来说&#xff0c;异常就是一个普通的对象&#xff0c;其保存了异常发生的相关信息&a…

《Maven》linux中安装maven并配置环境变量

阿丹&#xff1a; 很多项目需要在服务器上使用maven来打包&#xff0c;这里就需要使用配置maven来进行运行指令&#xff0c;本文章来快速的安装和配置一下这个Maven并且来完成环境变量的配置。 步骤 1: 安装Maven 在Linux系统上安装Maven: 如果你使用的是基于Debian的系统&a…

Codeforces Round 942 (Div. 2) (A-D2)C++题解

链接 : Dashboard - Codeforces Round 942 (Div. 2) - Codeforces A. Contest Proposal 数据范围小&#xff0c;模拟就好了; #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \n #define int long long typedef l…

ASP.NET网上车辆档案管理系统

摘 要 本文采用基于Web的Asp.net技术&#xff0c;并与sql server 2000数据库相结合&#xff0c;研发了一套车辆档案管理系统。该系统扩展性好&#xff0c;易于维护。简化了车辆档案设计流程&#xff0c;去除了冗余信息。汽车销售企业可以通过本系统完成整个销售及售后所有档案…

【Python】 逻辑回归:从训练到预测的完整案例

我把我唱给你听 把你纯真无邪的笑容给我吧 我们应该有快乐的 幸福的晴朗的时光 我把我唱给你听 用我炙热的感情感动你好吗 岁月是值得怀念的留恋的 害羞的红色脸庞 谁能够代替你呀 趁年轻尽情的爱吧 最最亲爱的人啊 路途遥远我们在一起吧 &#x1f3b5; 叶…

Redis 相关问题总结

Redis 相关问题 Redis 持久化机制 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题 热点数据和冷数据是什么 Memcache与Redis的区别都有哪些&#xff1f; 单线程的redis为什么这么快 redis的数据类型&#xff0c;以及每种数据类型的使用场景&#xff0c;Redis 内…