当前位置: 首页 > news >正文

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 当一个物体挂载了刚体时&#xff0c;即可在脚本中获取该物体的刚体组件&#xff0c;代码如下 Rigidbody rigid; void Start() { rigidGetComponent<Rigidbody>(); } 一般将刚体变量命名为rigid并定义为一个字段&#xff0c;方便复用. 二、施…...

Java基础(十七)File类与IO流

1. java.io.File类的使用 1.1 概述 File类及本章下的各种流&#xff0c;都定义在java.io包下。一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录&#xff08;俗称文件夹&#xff09;&#xff0c;与平台无关。&#xff08;体会万事万物皆对象&#xff09;File 能新…...

跑步课程导入能力,助力科学训练

HUAWEI Health Kit为开发者提供用户自定义的跑步课程导入接口&#xff0c;便于用户在华为运动健康App和华为智能穿戴设备上查看来自生态应用的训练课表&#xff0c;开启科学、适度的运动训练。 跑步课程导入能力支持生态应用在获取用户的华为帐号授权后&#xff0c;将跑步课程…...

MySQL---8、创建和管理表

1、基础知识 1.1 一条数据存储的过程 创建数据库-->确认字段-->创建数据表-->插入数据1.2 标识符的命名规则 1、数据库名、表名不得超过30个字符&#xff0c;变量名限制为29个 2、必须只能包含A-Z、a-z、0-9,、_共63个字符 3、数据库名、表名、字段名等对象名中间不…...

图像分类简单介绍

文章目录 图像分类简单介绍什么是图像分类图像分类的背景和意义传统的图像分类方法基于深度学习的图像分类方法总结 图像分类简单介绍 图像分类是计算机视觉领域的一个基本任务&#xff0c;其目标是将输入的图像分配给某个预定义的类别&#xff08;即标签&#xff09;。在本教…...

很多博主用Markdown格式文章?直呼真不错!

概述 Markdown 是一种轻量级标记语言&#xff0c;它可以使我们专注于写作内容&#xff0c;而不用过多关注排版&#xff0c;很多博主、作家等都用它来撰写文章~ 本文将给各位小伙伴介绍 Markdown 语法的使用&#xff0c;本篇文章索奇就是用的纯 markdown 语法来写的~ 标题 一级…...

【2023/05/07】汇编语言

Hello&#xff01;大家好&#xff0c;我是霜淮子&#xff0c;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. 译文&#xff1a; 夏天的鸟&…...

AI 生成第3篇测试文章:怎么编写测试计划?

背景 在软件开发过程中&#xff0c;测试是十分重要的环节&#xff0c;测试计划是测试的基础和重要的组成部分。一个完善的测试计划能够指导测试工作&#xff0c;明确测试范围和要求&#xff0c;提高测试效率&#xff0c;保证软件质量和可靠性。本文将从测试计划的定义、编写步…...

怎么洗稿容易过稿-在线洗稿软件

自媒体洗稿软件 即使您是一位优秀的自媒体写作人员&#xff0c;也难免遇到让人头疼的撰写问题&#xff0c;例如无法处理大量原始文本、需要手动删除冗余信息、缺少时间针对每篇文章进行深入修改等问题。但是&#xff0c;现在有了我们的一款自媒体洗稿软件&#xff0c;您再也不需…...

图书馆客流人数统计分析系统方案

智慧客流人数统计分析系统可以帮助图书馆管理者更好地管理人群流量。系统能够自动统计区域内的人流量高峰期&#xff0c;并通过数据分析提供更加合理的管控&#xff0c;从而提区域内人群流动性&#xff0c;避免拥堵的情况。 AI客流视觉监控 客流量管控分析系统意义 讯鹏客流量管…...

linux命令之crontab详解

crontab 提交和管理用户的需要周期性执行的任务 更多linux命令详解&#xff1a;linux命令在线工具 补充说明 crontab命令 被用来提交和管理用户的需要周期性执行的任务&#xff0c;与windows下的计划任务类似&#xff0c;当安装完成操作系统后&#xff0c;默认会安装此服务工…...

浅谈一下接口工具(jmeter、postman、swagger等)

一、接口都有哪些类型&#xff1f; 接口一般分为两种&#xff1a;1.程序内部的接口 2.系统对外的接口 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息&#xff0c;别人肯定不会把 数据库共享给你&#xff0c;他只能给你提供一个他们写好的方法来获取…...

面试题:react、 vue中的key有什么作用? (key的内部原理)

面试题:react、 vue中的key有什么作用? &#xff08;key的内部原理) 1.虚拟DOM中key的作用: key是虚拟DOM对象的标识&#xff0c;当状态中的数据发生变化时&#xff0c;Vue会根据【新数据】生成【新的虚拟DON】,随后Vue进行【新虚拟DOM】与【旧虚拟DOM】的差异比较&#xff0…...

C++之继承

目录 一、继承的概念及定义 1.1继承的概念 1.2继承的定义 1.2.1继承的格式 1.2.2继承基类成员访问方式的变化 二、基类和派生类对象赋值转换 三、继承中的作用域 4.派生类的默认成员函数 五、继承与友元 六、继承与静态成员 七、菱形继承及菱形虚拟继承 7.1菱形继承的问…...

轻松掌握!Pandas的数据添加技巧,3秒学会更高效的方法

在Pandas中&#xff0c;如果你想高效地向一个DataFrame添加一行数据&#xff0c;千万不要使用.append()方法&#xff01;因为这种方法需要创建新的对象然后再赋值&#xff0c;效率较低&#xff0c;尤其是DataFrame较大时。 本文将介绍3种Pandas添加一行数据更高效的方法&#x…...

层次结构工程命名建议

对于这种多层次的结构&#xff0c;我们可以采用一些通用的命名方式来描述不同的层次。以下是一种可能的方式&#xff0c;仅供参考&#xff1a; 第一层&#xff1a;模块/模块组件 可以采用名词或形容词名词的方式来命名&#xff0c;例如&#xff1a; Action: 动作Behavior: 行…...

Google Play应用广告该如何运作

Google 应用广告是一种付费广告渠道&#xff0c;可以帮助我们把应用推向特定的目标受众。比如可以使用应用安装广告&#xff0c;用来吸引用户安装我们的应用&#xff0c;我们可以选择手动设置出价和定位&#xff0c;或使用 Google Ads 自动设置目标和出价。 Google 在创建和投…...

Java版电子招投标系统源码之了解电子招标投标全流程

随着各级政府部门的大力推进&#xff0c;以及国内互联网的建设&#xff0c;电子招投标已经逐渐成为国内主流的招标投标方式&#xff0c;但是依然有很多人对电子招投标的流程不够了解&#xff0c;在具体操作上存在困难。虽然各个交易平台的招标投标在线操作会略有不同&#xff0…...

能源设备智能维修AR远程作业指导平台降低运营成本

AR远程专家指导系统是一种基于AR增强现实技术搭建的远程协作解决方案&#xff0c;它可以让专家全视角掌握操作现场&#xff0c;并将专精知识和技能传递给远程现场的工作人员&#xff0c;以帮助他们解决各种技术难题和困难&#xff0c;赋能各行各业行业。 现场人员通过手机、平板…...

【实验笔记】深度学习中的确定性Uncertainty in Deep Learning(资料汇总,不断更新)

现在我们传统深度学习算法几乎只能给出一个特定的结果&#xff0c;而不能给出模型自己对结果有多么confident. 的确&#xff0c;在分类问题中&#xff0c;我们会在网络的最后一层添加一个softmax函数来获得概率&#xff0c;但是模型仍然无法表示自己对结果不确定。 资料&#…...

nRF52硬件PWM深度解析:高精度、低抖动、多通道实时控制

1. nRF52_PWM硬件PWM库深度技术解析1.1 硬件PWM的工程必要性与nRF52平台特性在嵌入式实时控制系统中&#xff0c;PWM&#xff08;脉宽调制&#xff09;信号的质量直接决定执行机构的响应精度与系统稳定性。软件定时器实现的PWM&#xff08;如基于millis()或micros()的循环轮询&…...

AI Agent学习日记 Day3

今天没怎么搞&#xff0c;只做了一点小优化。之前我是用 agent.stream(invoke_input,stream_mode["messages", "updates"],config {"configurable": {"thread_id": "1"}}) 通过mode "messages"来获取并流式输…...

Pandas中groupby+agg的两种写法区别小结

在使用 Pandas 做数据统计时&#xff0c;groupby agg 是绕不开的操作。但很多人&#xff08;包括我自己&#xff09;在实际项目中都会遇到一个问题&#xff1a;为什么明明只是做个统计&#xff0c;结果 DataFrame 却变成了 MultiIndex&#xff0c; 后面 merge、导 Excel、画图…...

PX4飞控解锁失败?别慌!手把手教你用QGroundControl地面站排查15种常见黄灯警报

PX4飞控解锁失败&#xff1f;别慌&#xff01;手把手教你用QGroundControl地面站排查15种常见黄灯警报 当你满怀期待地准备让无人机起飞&#xff0c;却发现PX4飞控持续闪烁黄灯拒绝解锁时&#xff0c;那种挫败感我深有体会。作为从菜鸟阶段一路摸爬滚打过来的飞手&#xff0c;我…...

【数据结构】二叉树非递归前中后序遍历详解

二叉树的遍历是二叉树操作的基础核心&#xff0c;递归遍历实现简单但存在栈溢出风险&#xff0c;在处理深度较大的二叉树时&#xff0c;非递归遍历凭借手动维护栈的方式更具稳定性。本文将详细讲解二叉树前序、中序、后序的非递归遍历实现思路&#xff0c;结合 C 语言代码完整实…...

别再死磕 SEO 了,2026 年是 GEO 的天下:如何让大模型在搜索结果里“翻你的牌子”?

1. 为什么 2026 年你的 SEO 流量断崖式下跌&#xff1f;如果你最近发现网站的 GA&#xff08;Google Analytics&#xff09;或百度统计里的自然流量在掉&#xff0c;别急着骂运营。看看现在的搜索习惯&#xff1a;用户不再去翻第二页的蓝色链接&#xff0c;而是直接在 Perplexi…...

Thorium浏览器:为什么这个基于Chromium的优化版本能解决你90%的性能痛点?

Thorium浏览器&#xff1a;为什么这个基于Chromium的优化版本能解决你90%的性能痛点&#xff1f; 【免费下载链接】thorium Chromium fork named after radioactive element No. 90. Source code and Linux releases. Windows/MacOS/ARM builds served in different repos, lin…...

嵌入式软件开发中的柔性数组机制

在嵌入式系统开发中,内存资源始终是最核心的约束之一。无论是微控制器还是低功耗控制终端,程序设计都必须在有限的存储空间中实现功能、效率与可靠性的平衡。因此,开发者不仅需要关注算法逻辑,还必须重视数据结构对内存的占用方式。 在这种背景下,柔性数组成为嵌入式软件…...

基于VLFM的中文指令视觉语言导航系统设计与实现

基于VLFM的中文指令视觉语言导航系统设计与实现 一、引言 1.1 项目背景 视觉语言导航(Vision Language Navigation,VLN)是具身智能领域的核心任务之一,其目标是让智能体根据自然语言指令在三维环境中自主导航,完成路径规划与空间定位任务[reference:0]。近年来,随着大…...

Vue-Weixin 朋友圈功能实现全解析:图片上传与点赞评论交互详解

Vue-Weixin 朋友圈功能实现全解析&#xff1a;图片上传与点赞评论交互详解 【免费下载链接】vue-weixin Vue2 全家桶仿 微信App 项目&#xff0c;支持多人在线聊天和机器人聊天 项目地址: https://gitcode.com/gh_mirrors/vu/vue-weixin Vue-Weixin 是一个基于 Vue2 全家…...