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

2024-05-03 18:52

本文主要是介绍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游戏开发 碰撞器与触发器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/957409

相关文章

基于Python开发PDF转PNG的可视化工具

《基于Python开发PDF转PNG的可视化工具》在数字文档处理领域,PDF到图像格式的转换是常见需求,本文介绍如何利用Python的PyMuPDF库和Tkinter框架开发一个带图形界面的PDF转P... 目录一、引言二、功能特性三、技术架构1. 技术栈组成2. 系统架构javascript设计3.效果图

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

基于Python开发PPTX压缩工具

《基于Python开发PPTX压缩工具》在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,不便于传输和存储,所以本文将使用Python开发一个PPTX压缩工具,需要的可以了解下... 目录引言全部代码环境准备代码结构代码实现运行结果引言在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j