Unity物理系统脚本编程(上)

这篇具有很好参考价值的文章主要介绍了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()表示层的整数转化为层名字。文章来源地址https://www.toymoban.com/news/detail-440118.html

到了这里,关于Unity物理系统脚本编程(上)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设备工单管理系统如何实现工单流程自动化?

    设备工单管理系统属于工单系统的一种,基于其丰富的功能,它可以同时处理不同的多组流程,旨在有效处理发起人提交的事情,指派相应人员完成服务请求和记录全流程。该系统主要面向后勤管理、设备维护、物业管理、酒店民宿等服务行业设备工单管理系统可以帮助企业

    2024年02月13日
    浏览(39)
  • 【开源】基于JAVA+Vue+SpringBoot的大病保险管理系统

    基于Vue+SpringBoot+MySQL的城乡居民大病保险管理系统,包含患者档案、医保充值、保险档案、手术档案、看病登记、保险审核模块,包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,大病保险管理系统基于

    2024年01月23日
    浏览(54)
  • Unity 3D游戏开发+脚本编程完整指南:Unity脚本概览-控制物体的运动

    教程相关资源 Unity 3D游戏开发+脚本编程完整指南(工程文件+PPT).zip Unity 脚本概览 脚本编写并不困难,但是如果直接从细节开始讲起,会让 读者难以看到脚本编程的全貌。因此本章不急于阐述脚本编写 的细节,只介绍简单的修改物体位置、处理用户输入和检测碰 撞的方法

    2024年02月21日
    浏览(75)
  • 高效的工单管理系统具备哪些特点?“的修”工单系统对民宿运营管理有什么好处?

    随着企业不断发展和业务扩展,工单管理已成为企业运营的必要组成部分。一个有效且高效的工单管理系统对企业的运营至关重要。为了实现这一目标,企业需要选择适合自身需求的工单管理解决方案,并建立科学的工单管理流程。 高效的工单管理系统具备以下特点: 高自

    2024年02月08日
    浏览(52)
  • java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码

     工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理    工程项目各模块及其功能点清单 一、系统管理     1、数据字典:实现对数据字典

    2024年02月07日
    浏览(47)
  • Unity 3D脚本编程与游戏开发(3.2)

    5.3.4 制作背包界⾯         背包界⾯是此实例中的重点,因为它的屏幕适配⽐较有代表性。当屏幕⽐较“瘦⾼”时,道具列表中能显⽰更多道具项,⽽屏幕⽐较“矮胖”时,显⽰的道具项会变少。但这些都不影响玩家通过下拉滑动查看所有道具,如图5-37所⽰。       

    2024年04月12日
    浏览(63)
  • Unity 3D脚本编程与游戏开发(2.5)

    4.3.4 向量的点积         两个向量的点积是⼀个标量,其数值为两者⻓度相乘,再乘以两者夹⾓的余弦: a·b=|a|·|b|cosθ⽤坐标表⽰,公式为 (x1,y1,z1)·(x2,y2,z2)=x1x2+y1y2+z1z2         注意到,两个向量的点积是⼀个数(标量),只有⼤⼩,没有⽅向。⽽且点乘满⾜交换律,

    2024年02月03日
    浏览(46)
  • Unity 3D脚本编程与游戏开发【4.1】

    7.2.5 后期处理举例 Post Processing(后期处理)并不属于特效,但现代的特效表现离不开后期处理的⽀持。本⼩节以眩光(Bloom)为例,展⽰⼀种明亮的激光的制作⽅法,其效果如图7-13所⽰。 1. 安装后期处理扩展包         较新的Unity版本(如2018.4版本)已经内置了新版的后

    2024年04月26日
    浏览(42)
  • Unity 3D脚本编程与游戏开发(2.6)

    4.5.2 四元数的概念         四元数包含⼀个标量分量和⼀个三维向量分量,四元数Q可以记作Q=[w,(x,y,z)]         在3D数学中使⽤单位四元数表⽰旋转,下⾯给出四元数的公式定义。对于三维空间中旋转轴为n,旋转⾓度为a的旋转,如果⽤四元数表⽰,则4个分量分别为

    2024年02月03日
    浏览(50)
  • Unity 3D脚本编程与游戏开发(3.5)

    6.2.8 总结和拓展         本节利⽤Unity官⽅素材,以有限的篇幅解释了动画状态机的原理,以及动画制作中最基本但最重要的步骤。总的来看,⽬前的动画只做了4种状态——站⽴、⾛、跑和跳跃,还缺少下蹲、下蹲移动和落地缓冲等动作。好在这些动作只是对现有动作的

    2024年04月10日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包