unity中物体碰撞反弹(学习)

这篇博客详细介绍了在Unity中如何实现物体碰撞后的反弹效果。通过`BallControl`类,利用`Rigidbody2D`组件和`OnCollisionEnter2D`方法,结合`Vector2.Reflect`函数进行反射计算,确保小球在与墙壁或玩家碰撞时能正确反弹。同时,博客提到了避免使用`collision.contacts[0]`以减少内存垃圾的生成,建议使用`GetContact`或`GetContacts`替代。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

unity中物体碰撞反弹相关代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BallControl : MonoBehaviour
{
    //忽略小球第一次与玩家的碰撞
    private bool isStart; 
    //刚体组件
    private Rigidbody2D rbody;
    //上次碰撞的位置
    private Vector3 point;
    void Start()
    {
        rbody = GetComponent<Rigidbody2D>();
    }
    //开始移动
    public void StartMove()
    {
        //给球一个速度 方向 * 速度  new Vector2(1,1).normalized(单位向量)
        rbody.velocity = new Vector2(1,1).normalized * 1;
        isStart = true;
        //最开始的位置
        point = transform.position;
    }

    //当与墙壁和玩家碰撞时
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (isStart == false)
        {
            return;
        }

        if (transform.position == point)
        {
            return;
        }
        //销毁砖块
        if (collision.collider.tag == "brick")
        {
            Destroy(collision.collider.gameObject);
        }
        
        //反射
        Vector2 inVec = transform.position - point;
        point = transform.position;
        Vector2 outVec = Vector2.Reflect(inVec,collision.contacts[0].normal);
        rbody.velocity = outVec.normalized * 1;

    }

注1:

collision.contacts[0]:
public ContactPoint[] contacts
物理引擎生成的接触点。接触点存储在 Collision 结构中,每个接触均包含一个接触点、法线和碰撞的两个碰撞体

更新:应避免使用它,因为它会产生内存垃圾。改用 GetContact 或 GetContacts。

变量作用
normal接触点的法线。
otherCollider在该点接触的其他碰撞体
point接触点
separation在该接触点的碰撞体之间的距离
thisCollider在该点接触的第一个碰撞体。

注2:

public static Vector2 Reflect (Vector2 inDirection, Vector2 inNormal);
作用: 从法线定义的向量反射一个向量。

### Unity 中实现多个物体反弹效果 在 Unity 的开发过程中,可以通过物理引擎来模拟物体反弹行为。通常情况下,这涉及到刚体组件 `Rigidbody` 和碰撞器组件 `Collider` 的配置以及简单的脚本来控制逻辑。 以下是实现十个物体反弹的具体方法: #### 1. 配置场景中的对象 为了使物体能够正常反弹,需要确保每个游戏对象都具备以下组件: - **Collider**:用于检测与其他对象之间的碰撞。 - **Rigidbody**:赋予物体物理属性,使其能响应重力和碰撞。 这些组件可以在 Unity 编辑器中通过右键菜单或拖拽方式快速添加到目标对象上。 #### 2. 设置材质参数以调整弹跳特性 Unity 提供了一个名为 Physics Material 的资源类型,它允许开发者定义表面摩擦系数和恢复系数(Bounciness)。对于想要实现高弹性的球形或其他形状的对象来说,设置较高的 Bounciness 值是非常重要的[^1]。 #### 示例代码展示如何初始化并驱动一组预制件实例化后的运动状态: ```csharp using UnityEngine; public class BallSpawner : MonoBehaviour { public GameObject ballPrefab; public int numberOfBalls = 10; private void Start() { SpawnBalls(); } void SpawnBalls(){ for(int i=0;i<numberOfBalls;i++){ Vector3 spawnPosition=new Vector3(Random.Range(-5f,5f),Random.Range(1f,6f), Random.Range(-5f,5f)); Instantiate(ballPrefab,spawnPosition,this.transform.rotation); } } } ``` 上述代码片段展示了怎样随机分布在一定范围内的位置创建指定数量的小球实体,并给予它们初始速度方向以便观察其自然下落到地面后再次跃起的现象[^2]。 注意,在实际项目里还需要考虑更多细节比如边界条件处理防止溢出屏幕等问题;另外也可以加入一些视觉特效让整个过程更加生动有趣!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值