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

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

v0.dev快速开发

探索v0.dev:次世代开发者之利器 今之技艺日新月异,开发者之工具亦随之进步不辍。v0.dev者,新兴之开发者利器也,迅速引起众多开发者之瞩目。本文将引汝探究v0.dev之基本功能与优势,助汝速速上手,提升开发之效率。 何谓v0.dev? v0.dev者,现代化之开发者工具也,旨在简化并加速软件开发之过程。其集多种功能于一体,助开发者高效编写、测试及部署代码。无论汝为前端开发者、后端开发者

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的