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()表示层的整数转化为层名字。


相关文章
|
2月前
|
设计模式 存储 人工智能
深度解析Unity游戏开发:从零构建可扩展与可维护的游戏架构,让你的游戏项目在模块化设计、脚本对象运用及状态模式处理中焕发新生,实现高效迭代与团队协作的完美平衡之路
【9月更文挑战第1天】游戏开发中的架构设计是项目成功的关键。良好的架构能提升开发效率并确保项目的长期可维护性和可扩展性。在使用Unity引擎时,合理的架构尤为重要。本文探讨了如何在Unity中实现可扩展且易维护的游戏架构,包括模块化设计、使用脚本对象管理数据、应用设计模式(如状态模式)及采用MVC/MVVM架构模式。通过这些方法,可以显著提高开发效率和游戏质量。例如,模块化设计将游戏拆分为独立模块。
180 3
|
3月前
|
开发者 图形学 Java
揭秘Unity物理引擎核心技术:从刚体动力学到关节连接,全方位教你如何在虚拟世界中重现真实物理现象——含实战代码示例与详细解析
【8月更文挑战第31天】Unity物理引擎对于游戏开发至关重要,它能够模拟真实的物理效果,如刚体运动、碰撞检测及关节连接等。通过Rigidbody和Collider组件,开发者可以轻松实现物体间的互动与碰撞。本文通过具体代码示例介绍了如何使用Unity物理引擎实现物体运动、施加力、使用关节连接以及模拟弹簧效果等功能,帮助开发者提升游戏的真实感与沉浸感。
79 1
|
2月前
|
图形学 开发者 UED
Unity游戏开发必备技巧:深度解析事件系统运用之道,从生命周期回调到自定义事件,打造高效逻辑与流畅交互的全方位指南
【8月更文挑战第31天】在游戏开发中,事件系统是连接游戏逻辑与用户交互的关键。Unity提供了多种机制处理事件,如MonoBehaviour生命周期回调、事件系统组件及自定义事件。本文介绍如何有效利用这些机制,包括创建自定义事件和使用Unity内置事件系统提升游戏体验。通过合理安排代码执行时机,如在Awake、Start等方法中初始化组件,以及使用委托和事件处理复杂逻辑,可以使游戏更加高效且逻辑清晰。掌握这些技巧有助于开发者更好地应对游戏开发挑战。
121 0
|
3月前
|
开发者 图形学 Java
Unity物理引擎深度揭秘:从刚体碰撞到软体模拟,全面解析实现复杂物理交互的技巧与秘诀,助你打造超真实游戏体验
【8月更文挑战第31天】物理模拟在游戏开发中至关重要,可让虚拟世界更真实。Unity作为强大的跨平台游戏引擎,内置物理系统,支持从刚体碰撞到布料模拟的多种功能。通过添加Rigidbody组件,可实现物体受力和碰撞;使用AddForce()施加力;通过关节(如Fixed Joint)连接刚体以模拟复杂结构。Unity还支持软体物理,如布料和绳索模拟,进一步增强场景丰富度。掌握这些技术,可大幅提升游戏的真实感和玩家体验。
111 0
|
3月前
|
图形学 C# 开发者
Unity粒子系统全解析:从基础设置到高级编程技巧,教你轻松玩转绚丽多彩的视觉特效,打造震撼游戏画面的终极指南
【8月更文挑战第31天】粒子系统是Unity引擎的强大功能,可创建动态视觉效果,如火焰、爆炸等。本文介绍如何在Unity中使用粒子系统,并提供示例代码。首先创建粒子系统,然后调整Emission、Shape、Color over Lifetime等模块参数,实现所需效果。此外,还可通过C#脚本实现更复杂的粒子效果,增强游戏视觉冲击力和沉浸感。
187 0
|
3月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
79 0
|
3月前
|
开发者 图形学 前端开发
绝招放送:彻底解锁Unity UI系统奥秘,五大步骤教你如何缔造令人惊叹的沉浸式游戏体验,从Canvas到动画,一步一个脚印走向大师级UI设计
【8月更文挑战第31天】随着游戏开发技术的进步,UI成为提升游戏体验的关键。本文探讨如何利用Unity的UI系统创建美观且功能丰富的界面,包括Canvas、UI元素及Event System的使用,并通过具体示例代码展示按钮点击事件及淡入淡出动画的实现过程,助力开发者打造沉浸式的游戏体验。
95 0
|
3月前
|
图形学
Unity动画☀️Unity动画系统Bug集合
Unity动画☀️Unity动画系统Bug集合
|
5月前
|
存储 JSON 关系型数据库
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
160 2
|
5月前
|
图形学
【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统(下)
【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统
82 0