精华内容
下载资源
问答
  • unity笔记:2D刚体碰撞
    2021-01-19 16:19:25

    目录

    关于刚体休眠:

    2D 刚体工作原理

    组件详解

    【BodyType】 

    【Simulated】

    【Collision Detection】

    【Gravity Scale】

    【Sleeping Mode】

    【Interpolate】

    【Constraints】

    脚本调用

    ProjectSettings-Physics2D

    两个物体发生碰撞事件的前提是:运动的那个要有刚体。

    手册:https://docs.unity3d.com/2019.1/Documentation/Manual/class-Rigidbody2D.html

    以下内容大部分为手册内容,紫色字体为个人解读仅供参考。

    关于刚体休眠

    Rigidbody sleeping happens completely automatically. Whenever a rigidbody is slower than the sleepAngularVelocity and sleepVelocity it will start falling asleep. After a few frames of resting it will then be set to sleep. When the body is sleeping, no collision detection or simulation will be performed anymore. This saves a lot of CPU cycles.

    刚体休眠完全自动发生。只要刚体的速度低于sleepAngularVelocitysleepVelocity,该刚体就会开始休眠。其空闲一些帧后,就会被设置成休眠状态。处于休眠状态中的物体,不会再对其进行碰撞检测和模拟。这会节约大量的CPU开销。

    sleepAngularVelocity 和 sleepVelocity 可以在(Edit -> Project Settings -> Physics)修改。

    2D 刚体工作原理

    • 刚体的用途

    通常,Unity Editor 的 Transform 组件定义 GameObject(及其子游戏对象)在场景中的位置、旋转和缩放方式。当Transform被改变,它会更新其他组件,例如将对象渲染在哪里或 colliders 的位置之类的属性。2D 物理引擎可以移动 colliders并使它们相互作用,因此物理引擎需要一种方法将 colliders的移动传回Transform组件。此移动以及与colliders的连接便是 2D 刚体组件的用途。 

    • 不要修改Transform组件

    2D 刚体组件会覆盖Transform组件,并将其更新为 2D 刚体定义的位置/旋转。请注意,虽然仍然可以通过自行修改Transform组件来覆盖 2D 刚体(因为 Unity 会公开所有组件上的所有属性),但是这样会导致各种问题,例如游戏对象相互穿透或嵌入、以及不可预测的移动。

    • 附加到2D刚体的Colliders

    所有被添加到同一游戏对象或子对象的 2D colliders 组件都会被隐式附加到该 2D 刚体2D colliders被附加到 2D 刚体时,会随之移动。严禁使用Transform组件或任何colliders偏移来直接移动 2D colliders;而应移动 2D 刚体。这将提供最佳性能并确保正确的碰撞检测。连接到同一 2D 刚体的多个 2D colliders不会相互碰撞。这意味着可以创建一组colliders来有效充当一个复合colliders,使所有colliders都与 2D 刚体同步移动和旋转。

    设计场景时,可自由使用默认的 2D 刚体并开始附加colliders。这些colliders可使连接到不同 2D 刚体的任何其他colliders相互碰撞。

    组件详解

    • 【BodyType】 

     此选项决定了:

    • 移动行为(位置&旋转)” (对象能以何种方式发生位移/旋转)
    • 碰撞器交互(对象能与哪些类型的刚体发生碰撞)

    请注意,虽然 Rigidbody 2Ds 通常被描述为相互碰撞,但碰撞的是这些物体中的每一个的 Collider 2Ds。如果没有碰撞器,刚体 2D 不能相互碰撞。

    移动行为

    可发生碰撞的刚体类型

    (即:能触发函数回调的类型)

    性能消耗

    Dynamic

    (动态)

    默认类型

    模拟会移动的物体。

    运动方式:

    • 脚本 - velocity
    • 脚本 - 作用力(AddFroce
    • 重力
    • 碰撞
    全部最高

    Kinematic

    (运动学)

    模拟会移动、但仅在明确的用户控制下运动的物体。不会因物理模拟移动。

    运动方式:

    碰撞时无法被撼动(无限质量)。

    [ x ] Use Full Kinematic

    仅 Dynamic

    [ ] Use Full Kinematic:

    全部

    Static

    (静态)

    模拟不会移动的物体(具有无限质量 不可移动)

    velocity、AddForce、gravity、MovePosition、MoveRotation都不可用

    仅 Dynamic最低

    • Dynamic - 默认类型

    最常见、功能最全、性能消耗最大。位移可以受Velocity、作用力、重力、碰撞影响。

    Dynamic 刚体被设计为在simulation条件下移动。它具有可用的全套属性(例如有限质量和阻力),并受作用力重力的影响。Dynamic 刚体类型可以与所有其他刚体类型碰撞,是最具互动性的刚体类型。这是需要移动的对象最常见的刚体类型,因此是 2D 刚体的默认刚体类型。此外,由于具有动态性并与周围所有对象互动,因此也是性能成本最高的刚体类型。所有 Rigidbody 2D 属性都可用于此BodyType。 

    不要使用 Transform 组件来设置 Dynamic 2D刚体的位置或旋转。模拟系统会根据 Dynamic 2D 刚体的速度(velocity)对该刚体重新定位;可以通过脚本,对刚体施加来直接更改此值,也可以通过碰撞重力来间接更改此值。

    • Kinematic

    性能更好。运动完全依赖用户的脚本控制,碰撞虽可以被检测到,但无法影响其行动轨迹

    Kinematic 刚体设计为在simulation条件下移动,但是仅在非常明确的用户控制下进行。 

    Kinematic 2D 刚体不会作用力重力的影响,因此,Kinematic 的速度很快,与 Dynamic 2D 刚体相比,对系统资源的需求更低。Kinematic 2D 刚体被设计为通过 Rigidbody2D.MovePosition 或 Rigidbody2D.MoveRotation 进行显式重新定位。使用物理查询来检测碰撞,通过脚本确定 2D 刚体移动的位置和方式。

    Kinematic 2D 刚体仍然通过速度(velocity)移动,但是此velocity不受作用力重力的影响。Kinematic 2D 刚体不会与其他 Kinematic 2D 刚体和 Static 2D 刚体碰撞,只会与 Dynamic 2D 刚体碰撞。与 Static 2D 刚体相似,Kinematic 2D 刚体在碰撞期间的行为类似于不可移动的对象(就像具有无限质量)。选择此刚体类型时,与质量相关的属性将不可用。 

    [  ] Use Full Kinematic Contacts 选项

    不勾选:只检测与Dynamic 2D 刚体的碰撞

    勾选:检测与全部BodyType刚体的碰撞(只是能检测到,并不会在物理模拟层面产生影响)

    默认情况下会取消选中此框。如果希望 Kinematic 2D 刚体与所有 2D 刚体类型能够监测到碰撞,请启用此设置(选中复选框)。这种情况下类似于 Dynamic 2D 刚体,不同之处在于 Kinematic 2D 刚体在接触另一 2D 刚体组件时不会被物理引擎移动,而会充当一个具有无限质量不可移动对象

    禁用 Use Full Kinematic Contacts 时,Kinematic  2D 刚体只会与 Dynamic 2D 刚体碰撞,不会与其他 Kinematic 2D 刚体或 Static 2D 刚体碰撞(请注意Trigger碰撞器是此规则的例外情况)。这意味着不会发生碰撞脚本回调(OnCollisionEnterOnCollisionStayOnCollisionExit

    假如你要使用物理查询(例如 Physics.Raycast)来检测 2D 刚体应该移动的位置和方式时,以及需要多个 Kinematic 2D 刚体相互交互时,可能会很不方便。这时你可以启用 Use Full Kinematic Contacts 使 Kinematic 2D 刚体产生交互。

    Use Full Kinematic Contacts 允许显式控制 Kinematic 2D 刚体的位置和旋转,但是仍然允许完全碰撞回调。在需要显式控制所有 Rigidbody 2D 的设置中,使用 Kinematic Rigidbody 2D 代替 Dynamic Rigidbody 2D 仍具有完整的碰撞回调支持。

    • Static

    Static 2D 刚体设计为在simulation条件下完全不动;如果任何对象与 Static 2D 刚体碰撞,Static刚体的行为就像一个不可移动的物体(就像它有无限的质量)。此刚体类型也是使用资源最少的刚体类型。Static 刚体只能与 Dynamic 2D 刚体碰撞。不支持两个 Static 2D 刚体进行碰撞,因为这种刚体不是为了移动而设计的。

    可通过两种方法将 2D 刚体标记为  Static :

    1.对于具有 2D collider组件的游戏对象,不附加 2D 刚体组件。所有此类 2D 碰撞体在内部均视为已附加到单个隐藏的 Static 2D 刚体组件。(如果对象只添加了Collider组件,没有添加Rigidbody组件,效果等同于添加了一个Static刚体组件。)

    2.让 GameObject 拥有一个 Rigidbody 2D 并将该 Rigidbody 2D 设置为Static。

    方法 1 是创建 Static类型的 2D碰撞体的快速方法。当要创建大量 Static 类型的 2D 碰撞体时,不用为每个具有 2D Collider的游戏对象都添加 2D 刚体。

    方法 2 用于提高性能。如果需要在运行时移动或重新配置 Static 2D 碰撞体,该碰撞体具有自己的 2D 刚体时完成这些操作会更快。如果需要在运行时移动或重新配置一组 2D 碰撞体,则将这些碰撞体全部设为一个标记为 Static 的父 2D 刚体的子代会比单独移动每个游戏对象更快。

    注意:如上所述,Static 2D 刚体设计为不移动,因此不会考虑相交的两个 Static 2D 刚体对象之间的碰撞。然而,如果 Static 2D 刚体和 Kinematic 2D 刚体的其中一个 2D 碰撞体设置为触发器,两者就会交互作用

    注意:BodyType不要在运行时去修改,参考文章https://blog.csdn.net/serenahaven/article/details/78851089

    • 【Simulated】

    控制启用/禁用 2D刚体 2D物理模拟系统 之间的交互。(*2D刚体以及其附加的2D Colliders和2D关节)。使用它,比直接启用/禁用Collider2D组件和Joint2D组件更有效率——在内存和处理器方面。

    开启/禁用模拟。包括

    • 物理模拟系统控制的运动(重力、作用力)
    • Collider2D的碰撞
    • Joint2D的约束效果
    • 2D 刚体、2D 碰撞体和 2D 关节的所有内部物理对象 stay in /are left in memory

    为什么取消选中 Simulated 比单个组件控制更高效?

    在 2D 物理模拟中,2D 刚体会控制附加的 Collider2D 的位置和旋转,并允许 2D 关节组件将这些位置和旋转用作锚点。Collider2D 会随着附加的 2D 刚体的移动而移动。然后,Collider2D 会计算与附加到其他 2D 刚体的其他 Collider2D 的触点。2D 关节还会约束 2D 刚体的位置和旋转。所有这些操作都会耗费模拟时间。

    可通过单独启用/禁用组件来停止/启动 2D 物理模拟的各个元素,在 Collider2D 和 2D 关节组件上都可以执行此操作。但是,启用和禁用各个元素会带来内存使用和处理器处理成本。禁用Simulated时,2D 物理引擎不会生成需要模拟的基于物理的任何内部对象。启用Simulated时,2D 物理引擎会生成需要模拟的基于物理的内部对象。启用和禁用 2D 物理模拟组件意味着必须创建和销毁内部游戏对象和基于物理的内部组件;禁用Simulated比禁用单个组件更容易、更高效。

    注意:取消选中 2D 刚体的 Simulated 选项时,附加的所有 2D 碰撞体都会有效“隐形”,即:无法被任何物理查询(例如 Physics.Raycast)检测到。

    • 【Collision Detection】

    Discrete(离散):

            默认选项。关闭刚体的持续碰撞检测,仅会在新位置生成碰撞触点。 游戏对象在物理更新期间可能会重叠或穿过彼此(如果移动得足够快)。

    Continuous(连续):

            确保在Rigidbody2D移动时检测到所有碰撞。具有 2D 刚体和 2D 碰撞体的游戏对象在更新期间不会穿过彼此。相反,Unity 会计算 2D 碰撞体的第一个影响点,并将游戏对象移动到该点。请注意,此设置比 Discrete 耗费更多 CPU 时间。

    • 【Gravity Scale】

    重力。改为0将不受重力下坠影响。

    • 【Sleeping Mode】

    定义GameObject如何“睡眠”以节省CPU在静止时的时间。

    Never Sleep

    Sleeping is disabled (this should be avoided where possible, as it can impact system resources).

    禁止睡眠(应尽可能避免这样做,因为它会影响系统资源)

    Start Awake

    GameObject is initially awake.

    GameObject最初是唤醒的。

    Start Asleep

    GameObject is initially asleep but can be woken by collisions.

    GameObject最初处于睡眠状态,但可以通过碰撞唤醒。

    • 【Interpolate

    插值:定义如何在物理更新之中插入GameObject的移动(当运动趋于不稳定时很有用)

            None不应用平滑移动。
            Interpolate

    基于GameObject之前帧的位置,进行平滑移动差值。

            Extrapolate

    基于GameObject在下一帧中的位置估计,进行平滑移动差值。

    • 【Constraints】

    定义刚体运动的约束。

    冻结位置可选,停止刚体在世界坐标X和Y轴上移动。
    冻结旋转可选,停止刚体绕Z轴旋转。

    脚本调用

    参见https://www.cnblogs.com/qq2351194611/archive/2004/01/13/11911559.html

    ProjectSettings-Physics2D

    手册https://docs.unity3d.com/Manual/class-Physics2DManager.html 

    Gravity重力Set the amount of gravity applied to all Rigidbody 2D GameObjects. Generally, you only set gravity for the negative direction of the y-axis.

    设置应用于所有Rigidbody 2D的重力 游戏对象

    通常,仅将重力设置为y轴的负方向。

    Default Material默认材质Set a reference to the Physics Material 2D
     to use if none has been assigned to an individual Collider
     2D.
    设置要使用的  Physics Material 2D
     如果没有指定特定的2D碰撞器
    Velocity Iterations速度迭代Set the number of iterations made by the physics engine
     to resolve velocity effects. Higher numbers result in more accurate physics but at the cost of CPU time.
    设置由物理引擎为解决速度影响而进行的迭代次数。较高的数字会导致更精确的物理效果,但会占用CPU时间。
    Position Iterations位置迭代Set the number of iterations made by the physics engine to resolve position changes. Higher numbers result in more accurate physics but at the cost of CPU time.设置由物理引擎为解决位置变化而进行的迭代次数。较高的数字会导致更精确的物理效果,但会占用CPU时间。
    Velocity Threshold速度阈值Set the threshold for elastic collisions. Unity treats collisions with a relative velocity lower than this value as inelastic collisions (that is, the colliding GameObjects do not bounce off each other).设置弹性碰撞的阈值。Unity对待碰撞与相对速度低于此值作为非弹性碰撞(即,碰撞GameObjects不相互弹开时)。
    Max Linear Correction线性矫正最大值Set the maximum linear position correction used when solving constraints (from a range between 0.0001 to 1000000). This helps to prevent overshooting.设置求解约束时使用的最大线性位置校正(范围为0.0001至1000000)。这有助于防止过冲。
    Max Angular Correction角度矫正最大值Set the maximum angular correction used when solving constraints (from a range between 0.0001 to 1000000). This helps to prevent overshooting.设置求解约束时使用的最大角度校正(范围为0.0001至1000000)。这有助于防止过冲。
    Max Translation Speed最大移动速度Set the maximum linear speed of a Rigidbody
     2D GameObject during any physics update.
    设置使用2D刚体的GameObject在物理更新中线性速度的最大值
    Max Rotation Speed最大旋转速度Set the maximum rotation speed of a Rigidbody 2D GameObject during any physics update.设置使用2D刚体的GameObject在物理更新中旋转速度的最大值
    Baumgarte ScaleSet the scale factor that determines how fast Unity resolves collision overlaps.设置比例因子,该比例因子确定Unity解决碰撞重叠的速度。
    Baumgarte Time of Impact ScaleSet the scale factor that determines how fast Unity resolves time-of-impact overlaps.设置比例因子,该比例因子确定Unity解决碰撞时间重叠的速度。
    Time to Sleep进入睡眠的时间值The time (in seconds) that must pass after a Rigidbody 2D stops moving before it goes to sleep.2D刚体停止移动后,到进入睡眠之前所必须经过的时间(秒)。
    Linear Sleep Tolerance线性睡眠容差Set the linear speed below which a Rigidbody 2D goes to sleep after the Time to Sleep elapses.经过“Time to Sleep”的时间后,当2D刚体线性速度低于该值,刚体进入睡眠。
    Angular Sleep Tolerance角度睡眠容差Set the rotational speed below which a Rigidbody 2D goes to sleep after Time to Sleep elapses.经过“Time to Sleep”的时间后,当2D刚体旋转速度低于该值,刚体进入睡眠。
    Default Contact Offset默认接触(距离)偏移值Set a proximity distance value for colliders to be considered in contact, even they are not actually in contact. Colliders whose distance is less than the sum of their contactOffset values generate contacts. This allows the collision detection system to predictively enforce the contact constraint even when the objects are slightly separated.
    Caution: Reducing this value too far could cripple Unity’s ability to calculate continuous polygon collisions. Conversely, increasing the value too much could create artifacts for vertex collision.
    为被视为接触的对撞机设置接近距离值,即使它们实际上没有接触。距离小于其contactOffset值之和的碰撞器会生成接触。这使碰撞检测系统可以预测性地强制执行接触约束,即使物体稍微分离也是如此。
    注意:将该值减小得太多可能会削弱Unity计算连续多边形碰撞的能力。相反,过多增加该值可能会导致顶点碰撞的假象。
    Auto Simulation自动模拟Enable this option to automatically run the physics simulation or allow explicit control of it.启用此选项可自动运行物理模拟或允许对其进行显式控制。
    Queries Hit Triggers触发器命中查询Enable this option if you want Collider 2Ds marked as Triggers to return a hit when any physics query (such as Linecasts or Raycasts) intersects with them. Defaults to enabled.如果要让标记为isTriggerCollider 2D在任何物理查询(例如“线”或“射线”)与它们相交时返回命中,请启用此选项。默认为启用。
    Queries Start In CollidersEnable this option if you want physics queries that start inside a Collider 2D to detect the collider they start in.如果要在Collider 2D内部开始的物理查询检测它们开始的碰撞机,请启用此选项。
    Callbacks On DisableEnable this option to produce collision callbacks when a collider with contacts is disabled.
    Auto Sync Transforms自动同步转换Enable this option to automatically sync transform changes with the physics system.启用此选项可自动将变换更改与物理系统同步。
    Layer Collision Matrix图层碰撞阵列表Define how the layer-based collision detection system behaves. Select which layers on the Collision Matrix interact with the other layers by checking them.定义基于层的碰撞检测系统的行为。通过检查来选择“碰撞矩阵”上的哪些层与其他层进行交互。

    更多相关内容
  • Unity2d 学习笔记(四)碰撞检测

    千次阅读 2021-10-12 09:31:18
    首先,我们需要为想要进行碰撞检测的对象添加上图中绿色框中的两个组件,分别是 刚体2D以及盒子碰撞检测器。 其中盒子碰撞检测器中的触发按钮需要勾选。 当我们添加完上述的组件后,就需要编写脚本处理碰撞事件...

    碰撞检测功能在游戏开发里是比较常用的,比如地图上无法穿越的部分,以及对于敌人的攻击判定等等。这篇博客就开简单介绍一下碰撞事件的处理。

    参考视频:Unity碰撞检测_哔哩哔哩_bilibili

     首先,我们需要为想要进行碰撞检测的对象添加上图中绿色框中的两个组件,分别是 刚体2D 以及 盒子碰撞检测器

    其中 盒子碰撞检测器 中的触发按钮需要勾选。

     当我们添加完上述的组件后,就需要编写脚本处理碰撞事件了,主要有下面的三个函数。

     当我们在脚本中调用上面的三个函数就可以检测到碰撞了。

    我们给敌人对象也设置一个 盒子碰撞检测器,然后再角色对象脚本中加入碰撞检测,具体的代码如下

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class PlayerController : MonoBehaviour
    {
    
    
        // 人物移动的速度
        public float speed = 5;
    
        // 获取移动指令变量
        public float moveX;
        public float moveY;
    
        // 获取角色的动画器
        Animator animator;
    
        // 获取角色的刚体组件
        Rigidbody2D rd2d;
    
        // 动画器变量名
        string PlayerState = "PlayerState";
    
    
        // 角色状态表
        enum CharState
        {
            idle = 0,
            walk = 1,
            attack = 2
        }
    
    
        // Start is called before the first frame update
        void Start()
        {
            // 获取动画器
            animator = GetComponent<Animator>();
            // 获取刚体组件
            rd2d = GetComponent<Rigidbody2D>();
        }
    
        // Update is called once per frame
        void Update()
        {
            
        }
    
        void FixedUpdate()
        {
    
            // 首先判断是否移动
            // 获取x轴和y轴的移动指令
            // 获取水平方向指令
            moveX = Input.GetAxisRaw("Horizontal");
            // 获取垂直方向指令
            moveY = Input.GetAxisRaw("Vertical");
    
    
            
            // 获取人物的位置信息
            Vector2 p = transform.position;
            p.x = p.x + moveX * speed * Time.deltaTime;
            p.y = p.y + moveY * speed * Time.deltaTime;
    
            // 将新坐标赋值给物体位置管理属性
            transform.position = p;
            
            /*
            // 刚体的速度
            Vector2 movement = new Vector2();
            movement.x = moveX;
            movement.y = moveY;
            movement.Normalize();
            rd2d.velocity = movement * speed;
            */
    
            // 如果有移动就改变动画
            if (moveX != 0 || moveY != 0)
            {
                // 给动画器变量赋值
                animator.SetInteger(PlayerState, (int)CharState.walk);
                Debug.Log(animator.GetInteger(PlayerState));
            } else
            {
                animator.SetInteger(PlayerState, (int)CharState.idle);
                Debug.Log(animator.GetInteger(PlayerState));
            }
    
    
            // 然后判断是否按下了其他键
            if (Input.GetKey(KeyCode.K))
            {
                animator.SetInteger(PlayerState, (int)CharState.attack);
                Debug.Log(animator.GetInteger(PlayerState));
            }
    
        }
    
        /*
        void OnCollisionEnter()
        {
            Debug.Log("撞到啦...OnCollisionEnter");
        }
        */
    
    
        // 碰撞检测函数,进入的时候执行
        void OnTriggerEnter2D(Collider2D collider)
        {
            Debug.Log("撞到啦...");
            Debug.Log(collider.gameObject.tag);
        }
    
        //
        // 停留的时候执行
        void OnTriggerStay2D(Collider2D collider)
        {
            Debug.Log("一直停留在碰撞状态...");
        }
    
        // 退出的时候执行
        void OnTriggerExit2D(Collider2D collider)
        {
            Debug.Log("退出碰撞状态...");
        }
        
    
    }
    

    然后我们运行游戏,移动人物到敌人的地方就可以在控制台看到程序检测出碰撞了。

    展开全文
  • Unity2D碰撞无效问题和基本设置

    千次阅读 多人点赞 2021-02-23 10:43:06
    Unity2D碰撞无效问题和基本设置 最近开始学习unity,都是网站上找的一些白嫖的视频资源,然后也买了一些有关unity的比较新的书籍,这不论是视频还是书籍,讲述的内容主要讲的都是untiy3D,可能是因为unity2D功能是近...

    Unity2D碰撞无效问题和基本设置

    最近开始学习unity,都是网站上找的一些白嫖的视频资源,然后也买了一些有关unity的比较新的书籍,这不论是视频还是书籍,讲述的内容主要讲的都是untiy3D,可能是因为unity2D功能是近几年才推出完善的,所以相关的书籍和教学内容比较少。对于初学的我来说,获取到合适的3D模型资源浪费时间和精力,所以我就用2D的项目来做一些练习。结果就遇到了设置2D碰撞无法检测的问题。
    我所用的unity版本是2019.4.20.flc1(LTS),建立2D项目,但是所参照练习的书籍《Unity2D游戏开发从入门到精通》《unity3D 2D手机游戏开发第二版》包括我学的教学视频,建立的都是3D项目。我按照教学依次设置Box Collider 和RigidBody,设置好触发器,也在相关脚本中写入了OnTriggerEnter方法

    private void OnTriggerEnter(Collider other)
        {
    		Destroy(gameObject);
    		Destroy(other.gameObject);
    	}
    

    运行项目后,什么都没有发生,我的子弹正常穿过敌人,碰撞检测没有生效。作为一个初学者,首先我想到的是代码错误,代码内容很少,检测过后没有任何问题,然后我由仔细检查组件是否设置错误,发现也没有错误,最后我想到我建立的是2D项目,应该用2D相关的组件,于是将上述组件都换成了Box Collider2D 和RigidBody2D,当我再次运行后,发现还是没有任何反应,我打开随书赠送的3D项目资源资源,运行正常,碰撞也发生了,可见书上的内容正确无误。可是我想要的2D项目下的碰撞设置问题并没有解决,昨晚我睡觉前,我还在搜“untiy2D碰撞检测无效的问题”,突然看到一个帖子上的一行代码上OnTriggerEnter2D的字样,恍然大悟,我的组件设置为了适应2D项目的组件,但是代码并没有做相应的修改。(代码没有因为修改两个组件报错),于是第二天早上我将上述代码做以下替换:

     private void OnTriggerEnter2D(Collider2D collision)
        {
    		Destroy(gameObject);
    		Destroy(collision.gameObject);
    	}
    

    运行项目,成功实现我想要的碰撞后销毁物体的效果。

    总结: 在Unity中2D项目和3D项目所用的碰撞组件有所不同,相关的类和方法也有所不同。2D项目中两个物体想要实现碰撞,首先为双发挂上Box Collider2D组件,根据需求勾选Is Trigger属性,然后至少为其中一个挂上RigidBody2D组件,将body type设置为kinematic,最后也要使用使用2D项目的方法,unity2d很多方法名称跟3d的基本相同,只是在后面多了2D两个字符,如果是用vs进行代码的编写,可以在编写的时候看提示后方有没有带2D字符的函数,直接调用。下面两张图片依次是我在子弹和敌人身上挂的组件。
    子弹上挂的组件
    敌人上挂的组件
    可能这是一个很小的问题,但是希望能够对和我一样的初学者有所帮助。

    展开全文
  • 碰撞物体都添加到上 rigidbody2d组件。 其中body Type 一定要选择 Kinematic 原因:忘记了。到时查查。 (该选项是想保证能发生碰撞但是并不会发生效果) 2·添加 Collider 2d 组件  其中Is Trigger 不要选择...

    1·碰撞物体都添加到上 rigidbody2d组件。

    其中body Type 一定要选择 Kinematic

    原因:忘记了。到时查查。

    (该选项是想保证能发生碰撞但是并不会发生效果)

    2·添加 Collider 2d 组件 


    其中Is Trigger 不要选择

    原因:实验出来的结果。该结果和网上说的不太一样···



    代码层:

        void OnCollisionEnter2D(Collision2D coll)
        {
            Debug.Log("Trigger 开始进入碰撞:" + coll.gameObject.name);
        }


    该方法是当以上条件满足时 并且发生碰撞时发生。

    并且不会发生效果。适合在什么情况就不说了。老子吃东西去了。



    展开全文
  • unity2D 碰撞/触发函数

    千次阅读 2019-09-12 15:16:26
    碰撞 void OnCollisionEnter2D(Collision2D collision) void OnCollisionExit2D(Collision2D collision) 触发 OnTriggerEnter2D(Collider collider) OnTriggerExit2D(Collider collider);
  • 详解Unity中的刚体碰撞体组件

    千次阅读 2022-04-08 15:07:30
    Unity 中内置了一套完成的...而在 Unity 物理引擎中,刚体组件和碰撞体组件则是无法避开的,刚体组件是让物体产生物理行为的组件,而碰撞体组件则是让刚体与物体产生碰撞的组件,今天就来简要认识一下这两种组件吧。
  • Add Component添加Box Collider 2D碰撞体)Add Component添加Rigidbody(刚体)首先对碰撞体和刚体做一个简单的区分两句话概括碰撞体: 碰撞体才能被射线检测到,否则无法被检测 碰撞体是产生碰撞的前提两句话...
  • 一、创建精灵并添加刚体碰撞体 二、创建PlayerController脚本并编写 using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour {...
  • Unity刚体碰撞体,触碰器 Rigidbody 刚体 是赋予物体力的的作用效果的基础,包括重力,拉力(阻力也是拉力的一种),角拉力(角阻力同样)。 体现出来的就是物体悬空时会掉落,被其他东西碰到时(假设有碰撞体...
  • Unity 2D游戏:Rigidbody 2D(2D刚体

    万次阅读 多人点赞 2018-11-13 21:19:04
    设置为不同的运动行为(移动和旋转)和碰撞方式。 Dynamic(动态,默认)、Kinematic(运动学)、Static(静态) Dynamic Rigidbody2D 动态,默认 Dynamic Rigidbody2D被设计用来制作在物...
  • Unity 2D检测物体碰撞

    2022-01-30 13:53:23
    Unity2D中,检测物体碰撞首相要给物体添加两个属性分别是: rigibody和collider,刚体碰撞器。 collider有不同的形状,形状越复杂,开销越大。 collider上可以勾选is Trigger选项,如果勾选,Unity的物理引擎就...
  • 需要制作一款弹性碰撞效果下的2D休闲小游戏 功能实现: 使用Unity引擎自带的刚体以及物理材质 材质属性为摩擦系数为0.2,弹性系数为0.95(改为1的时候会越跳越高)。 问题描述: 一、给其增加一个水平方向的力...
  • 不论是2d还是3d的物体碰撞、触发检测之前,都要添加相应的组件collider,简单介绍几种比较常见的,Box Collider/Box Collider2D(箱式对撞机)、Capsule Collider/Capsule Collider2D(胶囊对撞机)、Sphere Collider/...
  • Unity刚体碰撞器、实验和总结

    万次阅读 多人点赞 2017-07-11 09:15:07
    Unity刚体碰撞器、实验和总结 碰撞盒与刚体分类
  • 给箭和对象都加了刚体碰撞,箭的预制体又加了个x轴上的恒定力为了让他可以横向飞走。 代码没有问题,<strong>OnCollisionEnter也都带了2D,但是就是箭直接穿过没有任何反应,声音和数值...
  • Unity 2D 自定义碰撞系统(一)

    千次阅读 多人点赞 2019-06-20 10:59:25
    但是由于Unity刚体是基于物理运算的,在发生碰撞的时候,会出现反弹等我们不希望出现的效果。 所以通过查看了一些类似的插件和官方的一些项目作为参考,实现了一个没有力的概念的碰撞系统。 效果 可以看出手感...
  • 一般而言, 刚体 Rigidbody 所在的 Box Collider 2D 的 trigger 不打勾(打不打勾看项目当时的需求和情况有所改变), 与之相撞的 BX2D 的 trigger 打勾 但大部分项目这种肯定是做好的, 那么就有一种可能是人物底部方形...
  • 1.选择物体 2.修改
  • CM vcam1的Cinemachine Virtual Camera组件的...但是,自带的2D的角色 的物理碰撞 发生穿透现象。 很可能是因为物理碰撞被挤出边界外面。 解决办法: 把这个边界物体的PolygonCollider2D的IsTrigger设置为勾...
  • 刚体组件还会影响物体发生碰撞时的反应,使物体遵循惯性定律,并在其他物体运动冲击作用下产生速度或者形变。为了利于开发者控制物理系统,Unity提供了多个属性接口。开发者可以通过更改这些参数来控制物体的物理...
  • unity不使用刚体碰撞检测

    万次阅读 2015-08-16 11:01:48
    孙广东 2015.8.15目的: 这篇文章的主要目的是为了让您了解有关于在Unity内如何使用没有刚体碰撞检测。在这里,检查的只是垂直运动方向,但可以通过修改脚本,将对象添加到场景检查其他方向 (或更改cube 的位置。...
  • unity3d刚体 了解Unity 3D刚体 (Understanding Unity 3D Rigidbodies) A rigidbody is a property, which, when added to any object, allows it to interact with a lot of fundamental physics behaviour, like ...
  • 首先,给主角添加2D刚体和2D碰撞器,为了让主角不受重力的影响,设置2D刚体的Body Type属性为Kinematic运动学,还有给需要碰撞的物体添加上2D碰撞器。 准备工作做好以后,控制主角移动却发现,并没有产生想要的...
  • Unity2d 玩家发射子弹

    千次阅读 2020-06-06 01:30:49
    添加2D碰撞盒 子弹挂载脚本 制作成预制体 设定玩家层和子弹层 项目设置:不允许子弹层与子弹层、子弹层与玩家层发生碰撞 玩家调用脚本 选择齿轮图片 设置单位像素数 给齿轮添加刚体 设置重力大小为...
  • 碰撞事件 碰撞产生的条件 两物都有Collider 至少有一个带有RigidBody 回调方法 OnCollisionEnter(Collision other) 碰撞开始一瞬间时调用一次 OnCollisionStay(Collision other) 碰撞过程中相对运动时持续...
  • Unity 关于刚体抖动的问题

    千次阅读 2019-03-06 22:10:20
    一、是刚体物体可能与其他碰撞体有持续的接触,刚体在接触面上移动,比如说刚体在一个带有boxcolider的地面上移动,这个时候你就会发现有些地方会导致刚体位置的变化,应为boxcolider有一定厚度,你人物的colider...
  • 因为人物添加了Box Collider 2D刚体,因此当碰撞后会模拟实际的运动情况,和其它碰撞碰撞后会发生抖动; 解决方法: 通过刚体控制物体的运动和位置,而不是通过 transfrom.position 来获得物体的位置并更新; ...
  • unity2D 忽略物体之间的碰撞

    千次阅读 2014-06-01 18:48:00
    打开edit->project settings->physical2D (2D的游戏千万注意选这个2D而不是选physical) 将player和player层与层之间的勾号去掉就行了,这样属于这个层的物体相互之间都不会发生碰撞
  • 2D刚体碰撞

    2017-06-14 10:02:05
    我们看下Rigidbody 2D刚体的属性。    mass:0代表着无限大,也就是“静态刚体”。范围:0.001到100000。  linear Drag:线性阻尼,也就是物体在...
  • 先解释一下为什么会出现碰撞时精灵抖动的bug: 有一种可能是我们修改精灵的位置时是对精灵的transform中的position进行操作,这样会不考虑物理碰撞,所以两个精灵碰撞时会相互嵌入,然后因为物理引擎又会相互分离,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,000
精华内容 800
关键字:

unity2d刚体碰撞