Unity 3d 刚体与碰撞体属性 固定、铰链、弹簧关节的使用 子弹的发射和销毁

本文主要是介绍Unity 3d 刚体与碰撞体属性 固定、铰链、弹簧关节的使用 子弹的发射和销毁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

任务:子弹射击实例 
1. 定义物理射线; 
2. 实现从摄像机到鼠标目标位置射线发射子弹并碰撞目标对象的碰撞效果; 
3. 功能: 

利用子弹预制体生成子弹; 
利用 cube 生成一墙面;墙面 cube 对象带有刚体和碰撞体组件; 
利用 Random.range(float, float) 在随机的位置生成一个 cube 对象; 
对随机生成的 cube 对象添加 box collider 碰撞体组件; 
鼠标点击发射一带有刚体和碰撞体的子弹; 
子弹撞击 cube 墙面后带有物理碰撞效果; 
子弹跟随机生成的 cube 对象触发检测,触碰后销毁; 

使用技巧

vs不错!

添加刚体组件

才会具有动力学特征,才会动

重力

两个组件:刚体,碰撞体

添加了碰撞体,才会发生碰撞

四种情况

• 第一种情况:主模型有刚体和碰撞体,目标物体只有碰撞体,没有刚体
效果:主模型和目标物体碰撞,但是碰不动
• 第二种情况:主模型只有刚体,没有碰撞体,目标物体只有碰撞体,没有刚体
效果:主模型会直接掉落到地面以下
• 第三种情况:主模型有刚体和碰撞体,目标物体没有碰撞体和刚体
效果:主模型会直接穿透目标物体
• 第四种情况:主模型和目标物体都有刚体和碰撞体
效果:主模型与目标物体相撞,且可以直接将其撞倒

Is Kinematic / 作为触发器:

可以穿透,不会碰撞

添加物理材质

创建一个主要的cube

创建一个RigidbodyMovement.cs脚本,并将其绑定到此cube上

主要功能:键盘操控,鼠标拖动,碰撞检测

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class RigidbodyMovement : MonoBehaviour
{Rigidbody rbody;//公开到显示面板 publicpublic float speed = 30f;//速度预先定义在外部// Start is called before the first frame updatevoid Start(){rbody = GetComponent<Rigidbody>();//获取一个对象上面的刚体组件}// Update is called once per framevoid Update(){//获取虚拟轴,h、v定义在函数体内部float h = Input.GetAxis("Horizontal");//获取水平轴,即左右键返回的数据float v = Input.GetAxis("Vertical");//获取垂直轴,即上下键返回的数据rbody.MovePosition(rbody.position + transform.right * h * Time.deltaTime * speed);//刚体左右移动rbody.MovePosition(rbody.position + transform.forward * v * Time.deltaTime * speed);//刚体上下移动}private void OnMouseDrag(){//通过鼠标扯拽控制刚体移动transform.position += Vector3.right * speed * Time.deltaTime * Input.GetAxis("Mouse X");transform.position += Vector3.up * speed * Time.deltaTime * Input.GetAxis("Mouse Y");transform.position += Vector3.forward * speed * Time.deltaTime * Input.GetAxis("Mouse ScrollWheel");}private void OnCollisionEnter(Collision collision){//碰撞进入瞬间显示除地板外碰撞体名称if (collision.gameObject.name != "Plane"){print("the name of collision enrty:" + collision.gameObject.name);}}private void OnCollisionStay(Collision collision){//碰撞中显示除地板外碰撞体名称if (collision.gameObject.name != "Plane"){print("the name of collision stay:" + collision.gameObject.name);}}private void OnCollisionExit(Collision collision){//碰撞退出瞬间显示除地板外碰撞体名称if (collision.gameObject.name != "Plane"){print("the name of collision exit:" + collision.gameObject.name);}}private void OnTriggerEnter(Collider other){//如果另外一个碰撞体进入了触发器,则显示其名称print("triggerEnter:" + other.gameObject.name);}private void OnTriggerStay(Collider other){print("triggerStay:" + other.gameObject.name);}private void OnTriggerExit(Collider other){print("triggerExit:" + other.gameObject.name);}
}

MovePosition(三维向量) 改变位置

MoveRotation 让其旋转

效果如下

 

固定关节的用法

先创建一个空对象,再添加关节组件

关节要具有运动学特征才能被固定

所以要勾选 Is Kinematic

kinematic  
adj.运动的;运动学的;

这样红色方块无论是否受重力作用,都被固定在关节上了。

效果

HingeJoint 铰链关节

先创建一个空对象,再添加铰链关节组件

添加铰链关节组件会自动添加刚体组件

设定铰链关节的绑定对象:绿色方块  //这里不要绑错,不然没有反应

铰链关节属性设置

关闭重力作用(不影响cube的摆动),打开动力学属性(固定铰链,保持静止)

绿色方块属性设置

打开重力作用(摆动的动力来源),关闭动力学属性(这样不会静止) //为什么?不能理解。

绑定在空对象上的cube,这个transform属性的位置是相对位置。

先把相对位置设为(0,0,0),此时cube不会摆动。

改变z值,随便改一个,比如1,cube开始摆动。

效果

弹簧关节

先创建一个空对象,再添加弹簧关节组件

绑定球体至弹簧上

效果

 

点击以发射子弹

创建一个子弹(刚体)

把它做成预制体:

先创建一个Prefab文件夹,再把子弹拖进去,就变蓝了

创建BulletFire.cs脚本

using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using UnityEngine;public class BulletFire : MonoBehaviour
{Ray ray;//定义射线public Rigidbody bullet_rigidbody;//定义子弹刚体RaycastHit raycastHit;//射线碰撞检测// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){if(Input.GetMouseButtonDown(0)){ray = Camera.main.ScreenPointToRay(Input.mousePosition);//生成一条射线if (Physics.Raycast(ray, out raycastHit))//射线检测:如果和其他物体碰撞,就发射子弹{Rigidbody bullet = Instantiate<Rigidbody>(bullet_rigidbody);//定义子弹刚体,然后克隆一个子弹//此处不用bullet.position,而是bullet.transform.position,两者有区别bullet.transform.position = Camera.main.transform.position;//子弹初始位置设为摄像机的位置bullet.AddForce((raycastHit.point - bullet.transform.position)*3f,ForceMode.Impulse);//AddForce函数:给刚体施加一个力,然后发射出去。注意括号。//Destroy(raycastHit.collider.gameObject);//销毁点击对象}}}
}

把该脚本绑定到摄像机上,并在属性中指定子弹的预制体

效果(指哪打哪)

 

子弹的销毁(防止浪费内存资源)

创建一个DestroyBullet.cs脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class DestoryBullet : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){}private void OnCollisionEnter(Collision collision){if(collision.gameObject.tag!="bullet"){return;}Destroy(collision.gameObject);}private void OnTriggerStay(Collider other){if (other.gameObject.tag != "bullet")return;if (other.attachedRigidbody)other.attachedRigidbody.AddForce(Vector3.up * 20f);}
}

通过碰撞检测+标签的方式实现

给子弹添加标签

如果与墙碰撞的东西是子弹,就销毁子弹。

把脚本绑定到墙上,记得把墙固定住

注意:墙不能设置为触发器,否则无法碰撞,也就无法销毁子弹

效果

子弹碰墙后被销毁

 

子弹穿过cube加速

(代码包含在上面)

cube设置为

透明材质(暂时不会)

效果

子弹明显加速

 

随机生成Cube(按A键控制生成),子弹若与其碰撞,将被销毁

创建cube预制体,设定为可被撞开(运动学on)

若用代码创建cube,则难以调整其运动学属性

GameObject cloneCube = Instantiate(cubeObj, new Vector3(0, 3, 0), Quaternion.identity);
GameObject cubeObj = GameObject.CreatePrimitive(PrimitiveType.Cube);
cubeObj.GetComponent<Renderer>().material.color = Color.cyan;

创建RandomCube.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class RandomCube : MonoBehaviour
{public Rigidbody cubeObj;//public GameObject cubeObject;// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){if (Input.GetKey(KeyCode.A)){Rigidbody cloneCube=Instantiate<Rigidbody>(cubeObj);float x = Random.Range(-5.0f, 5.0f);float y = Random.Range(1f, 5.0f);float z = Random.Range(-5.0f, 5.0f);cubeObj.transform.position = new Vector3(x, y, z);cubeObj.tag = "RandomCube";cubeObj.name = "RandomCube";}}
}

把RandomCube.cs挂到平面上

实现销毁子弹的效果,就把DestroyBullet.cs挂到RandomCube预制体上

效果

按A随机生成RandomCube,子弹撞击后,子弹销毁,RandomCube在撞击下运动

一张合照

 

 

 

 

这篇关于Unity 3d 刚体与碰撞体属性 固定、铰链、弹簧关节的使用 子弹的发射和销毁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.