Unity物理系统脚本编程(上)
一、获取刚体组件Rigidbody
当一个物体挂载了刚体时,即可在脚本中获取该物体的刚体组件,代码如下
Rigidbody rigid;
void Start()
{
rigid=GetComponent<Rigidbody>();
}
一般将刚体变量命名为rigid并定义为一个字段,方便复用.
二、施加作用力AddForce
最常用的施加作用力的方法是AddForce(),参数为Vector3类型。代码如下
rigid.AddForce(new Vector3(0,100,0));
上述代码表示对刚体施加一个向上的100N的力。持续时间看具体情况。
三、修改速度velocity
对于物理系统中的刚体来说,速度非常重要。影响着动量、动能,决定着碰撞的结果。
在Unity中获取、修改刚体速度的代码如下
Vector3 vel=rigid.velocity;
rigid.velocity=vel+new Vector3(0,0,1);
下面举一个多段跳跃的例子
usingUnityEngine;
public class SimpleJump:MonoBehaviour
{
Rigidbody rigid;
void Start()
{
rigid=GetComponent<Rigidbody>();
}
private void Update()
{
if(Input.GetButtonDown("Jump"))
{
rigid.AddForce(new Vector3(0,100,0));
}
}
}
但实际测试发现,如果角色处于上升阶段时再次跳跃,最大高度就会大于单次跳跃的2倍。如果处于下降阶段,就很难在空中跳起来,可能只会停顿一下,延缓下落时间。完全符合物理规律。
若要实现二段跳,则只需要令其在跳跃时y轴速度为0即可,加上如下代码
rigid.velocity=newVector(rigid.velocity.x,0,rigid.velocity.z);
四、射线的使用方法
射线在游戏中应用非常广泛,举几个例子
- 游戏中有单击地面的操作,因此要发射射线以确定是否点中了可单🐔区域和单🐓位置的坐标。
- 在判定子弹或技能是否击中目标时,如果采用碰撞体,需要考虑子弹速度,且存在穿透问题,而射线是没有速度的(瞬时发生),不仅易于使用,且综合效率更高。
- 在3D或2D游戏中,判断玩家是否落地,可以向玩家脚下发射射线;判断是否接触墙壁,可以往左右两侧发射射线;判断玩家是否低头,可以往头顶发射射线;判断玩家是否需要攀爬,也可以采用射线检测
- 因为射线与视线一样,会被障碍物阻挡,因此在游戏AI设计中,可以用射线模拟AI角色的视线。
⚠️:上述的各种射线检测都是以物理系统为基础的。射线需要雨碰撞体和触发器配合才能发挥作用。
下面来介绍一下射线编程方法。
常用的直线型射线用类型Ray表示。Ray包含了origin(起点)和direction(方向)的定义,起点和方向都用Vector3表示。
有很多方法可以在游戏事件中发射一条射线,最常用的方法是Physics.Raycast()和Physics.RaycastAll()。
Physics.Raycast()有十种以上重载方式,列出以下三种重载形式:
bool Raycast(Vector3 origin,Vector3 direction);
bool Raycast(Vector3 origin,Vector3 direction,float maxDistance);
bool Raycast(Vector3 origin,Vector3 direction,float maxDistance,int layMask);
以上三个函数共同的参数都是发射点坐标和方向向量,返回值都是是否击中了某个碰撞体或触发器。第三个参数是射线的最大指定长度
除了指定方向和位置的射线以外,以下还有一类很常用的重载形式:
bool Raycast(Ray ray,out RaycastHit hitInfo);
bool Raycast(Ray ray,out RaycastHit hitInfo,float maxDistance);
bool Raycast(Ray ray,out RaycastHit hitInfo,float maxDistance,int layerMask);
这种形式的射线检测用了一种常用结构体Ray(射线),它只是将射线数据对象先单独创建出来,并没有实际区别
Ray对象有多种创建方法,举例如下:
Ray ray=new Ray(Vector3.zero,Vector3.up);
Vector2 mousePos=Input.mousePosition;
Ray ray2=Camera.main.ScreenPointToRay(mousePos);
physics.Raycast(ray,10000,LayMask.GetMask("Default"));
五、层和层遮罩
很多时候,需要射线仅被某些物体阻挡,例如希望检测地面的射线只检测地面,而不检测其他东西。这就要用到Layer和Layer Mask(层遮罩)了。
"层"的概念让物理系统变得更好用。如一颗子弹,仅让它碰到Ground、Player和Obstacle这三个层,代码如下
int mask=LayerMask.GetMask("Ground","Player","Obstacle");
if(Physics.Raycast(transform.position,Vector3.forward,mask))
{
//碰到了物体
}
如果让mask表示这三层以外的所有层,则只用令mask=~mask即可。
有时需要改变物体所在的层,如将一个物体设置在Default层上,代码如下
gameObject.layer=LayerMask.NameToLayer("Default");
可以通过LayerMask.NameToLayer()将层名转化为整数表示的层,也可以用函数LayerMask.LayerToName()表示层的整数转化为层名字。
相关文章:
Unity物理系统脚本编程(上)
一、获取刚体组件Rigidbody 当一个物体挂载了刚体时,即可在脚本中获取该物体的刚体组件,代码如下 Rigidbody rigid; void Start() { rigidGetComponent<Rigidbody>(); } 一般将刚体变量命名为rigid并定义为一个字段,方便复用. 二、施…...
Java基础(十七)File类与IO流
1. java.io.File类的使用 1.1 概述 File类及本章下的各种流,都定义在java.io包下。一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录(俗称文件夹),与平台无关。(体会万事万物皆对象)File 能新…...
跑步课程导入能力,助力科学训练
HUAWEI Health Kit为开发者提供用户自定义的跑步课程导入接口,便于用户在华为运动健康App和华为智能穿戴设备上查看来自生态应用的训练课表,开启科学、适度的运动训练。 跑步课程导入能力支持生态应用在获取用户的华为帐号授权后,将跑步课程…...
MySQL---8、创建和管理表
1、基础知识 1.1 一条数据存储的过程 创建数据库-->确认字段-->创建数据表-->插入数据1.2 标识符的命名规则 1、数据库名、表名不得超过30个字符,变量名限制为29个 2、必须只能包含A-Z、a-z、0-9,、_共63个字符 3、数据库名、表名、字段名等对象名中间不…...
图像分类简单介绍
文章目录 图像分类简单介绍什么是图像分类图像分类的背景和意义传统的图像分类方法基于深度学习的图像分类方法总结 图像分类简单介绍 图像分类是计算机视觉领域的一个基本任务,其目标是将输入的图像分配给某个预定义的类别(即标签)。在本教…...
很多博主用Markdown格式文章?直呼真不错!
概述 Markdown 是一种轻量级标记语言,它可以使我们专注于写作内容,而不用过多关注排版,很多博主、作家等都用它来撰写文章~ 本文将给各位小伙伴介绍 Markdown 语法的使用,本篇文章索奇就是用的纯 markdown 语法来写的~ 标题 一级…...
【2023/05/07】汇编语言
Hello!大家好,我是霜淮子,2023倒计时第2天。 Share Stray birds of summer come to my window to sing and fly away. And yellow leaves of autumn,which have no songs,flutter and full there with a sigh. 译文: 夏天的鸟&…...
AI 生成第3篇测试文章:怎么编写测试计划?
背景 在软件开发过程中,测试是十分重要的环节,测试计划是测试的基础和重要的组成部分。一个完善的测试计划能够指导测试工作,明确测试范围和要求,提高测试效率,保证软件质量和可靠性。本文将从测试计划的定义、编写步…...
怎么洗稿容易过稿-在线洗稿软件
自媒体洗稿软件 即使您是一位优秀的自媒体写作人员,也难免遇到让人头疼的撰写问题,例如无法处理大量原始文本、需要手动删除冗余信息、缺少时间针对每篇文章进行深入修改等问题。但是,现在有了我们的一款自媒体洗稿软件,您再也不需…...
图书馆客流人数统计分析系统方案
智慧客流人数统计分析系统可以帮助图书馆管理者更好地管理人群流量。系统能够自动统计区域内的人流量高峰期,并通过数据分析提供更加合理的管控,从而提区域内人群流动性,避免拥堵的情况。 AI客流视觉监控 客流量管控分析系统意义 讯鹏客流量管…...
linux命令之crontab详解
crontab 提交和管理用户的需要周期性执行的任务 更多linux命令详解:linux命令在线工具 补充说明 crontab命令 被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工…...
浅谈一下接口工具(jmeter、postman、swagger等)
一、接口都有哪些类型? 接口一般分为两种:1.程序内部的接口 2.系统对外的接口 系统对外的接口:比如你要从别的网站或服务器上获取资源或信息,别人肯定不会把 数据库共享给你,他只能给你提供一个他们写好的方法来获取…...
面试题:react、 vue中的key有什么作用? (key的内部原理)
面试题:react、 vue中的key有什么作用? (key的内部原理) 1.虚拟DOM中key的作用: key是虚拟DOM对象的标识,当状态中的数据发生变化时,Vue会根据【新数据】生成【新的虚拟DON】,随后Vue进行【新虚拟DOM】与【旧虚拟DOM】的差异比较࿰…...
C++之继承
目录 一、继承的概念及定义 1.1继承的概念 1.2继承的定义 1.2.1继承的格式 1.2.2继承基类成员访问方式的变化 二、基类和派生类对象赋值转换 三、继承中的作用域 4.派生类的默认成员函数 五、继承与友元 六、继承与静态成员 七、菱形继承及菱形虚拟继承 7.1菱形继承的问…...
轻松掌握!Pandas的数据添加技巧,3秒学会更高效的方法
在Pandas中,如果你想高效地向一个DataFrame添加一行数据,千万不要使用.append()方法!因为这种方法需要创建新的对象然后再赋值,效率较低,尤其是DataFrame较大时。 本文将介绍3种Pandas添加一行数据更高效的方法&#x…...
层次结构工程命名建议
对于这种多层次的结构,我们可以采用一些通用的命名方式来描述不同的层次。以下是一种可能的方式,仅供参考: 第一层:模块/模块组件 可以采用名词或形容词名词的方式来命名,例如: Action: 动作Behavior: 行…...
Google Play应用广告该如何运作
Google 应用广告是一种付费广告渠道,可以帮助我们把应用推向特定的目标受众。比如可以使用应用安装广告,用来吸引用户安装我们的应用,我们可以选择手动设置出价和定位,或使用 Google Ads 自动设置目标和出价。 Google 在创建和投…...
Java版电子招投标系统源码之了解电子招标投标全流程
随着各级政府部门的大力推进,以及国内互联网的建设,电子招投标已经逐渐成为国内主流的招标投标方式,但是依然有很多人对电子招投标的流程不够了解,在具体操作上存在困难。虽然各个交易平台的招标投标在线操作会略有不同࿰…...
能源设备智能维修AR远程作业指导平台降低运营成本
AR远程专家指导系统是一种基于AR增强现实技术搭建的远程协作解决方案,它可以让专家全视角掌握操作现场,并将专精知识和技能传递给远程现场的工作人员,以帮助他们解决各种技术难题和困难,赋能各行各业行业。 现场人员通过手机、平板…...
【实验笔记】深度学习中的确定性Uncertainty in Deep Learning(资料汇总,不断更新)
现在我们传统深度学习算法几乎只能给出一个特定的结果,而不能给出模型自己对结果有多么confident. 的确,在分类问题中,我们会在网络的最后一层添加一个softmax函数来获得概率,但是模型仍然无法表示自己对结果不确定。 资料&#…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
