【100个 Unity实用技能】 | 求反射向量的方法,让小球按照物理反射的角度反弹(出射角=入射角)

2023-02-16 14:06:12 浏览数 (1)

Unity 小科普

老规矩,先介绍一下 Unity 的科普小知识:

  • Unity是 实时3D互动内容创作和运营平台 。
  • 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。
  • Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。
  • 也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏!
  • 博客主页:https://xiaoy.blog.csdn.net
  • 本文由 呆呆敲代码的小Y 原创,首发于 CSDN
  • 学习专栏推荐:Unity系统学习专栏
  • 游戏制作专栏推荐:游戏制作
  • Unity实战100例专栏推荐:Unity 实战100例 教程

Unity 实用小技能学习

Unity求反射向量的方法,让小球按照物理反射的角度反弹(出射角=入射角)

在程序中有时候会用到某物体遇到墙壁之后按照物理学角度进行弹射的功能,也就是利用 入射角=出射角 模拟物理反射。

这里我们利用Unity的碰撞检测来实现具体功能,当物体撞击到墙壁之后调用GetContact(0)拿到该物体第一个发生碰撞的接触点坐标的法向量,然后调用 Vector3.Reflect(入射向量,法向量)方法。

入射向量 就是该物体原来移动的向量,将这两个向量传入,即可求出反射向量,然后将该物体的移动方向改为求得的反射向量即可实现弹射功能。

这样我们就可以模拟现实中物体碰到墙壁后的正常弹射运动曲线,实现弹射运动。

示例代码如下:

代码语言:javascript复制
    private Vector3 direction;//物体移动向量
    public float moveSpeed;//物体移动速度

    private void Start()
    {
        //获取一个随机方向,或者直接赋值某个方向都行。
        direction = GetRandomRotation();
    }

    void Update()
    {
        //物体持续按给定的方向移动
        transform.position  = direction * moveSpeed * Time.deltaTime;
    }

    private void OnCollisionEnter(Collision collision)
    {
    	//检测碰到墙壁时改变物体原有移动方向
        if (collision.gameObject.tag.Equals("Obstacle"))
        {
            Vector3 dir = Vector3.Reflect(direction, collision.GetContact(0).normal);
            dir.y = 0;
            direction = dir;
        }
    }
    
    private Vector3 GetRandomRotation()
    {
        Vector3 dir = new Vector3(Random.Range(-1f, 1f), 0, Random.Range(-1f, 1f)).normalized;
        return dir;
    }

注意点: 移动的物体需要挂载刚体和碰撞体,墙壁需要挂载碰撞体。否则无法触发碰撞,这是碰撞检测的必要条件。 本方法受限于 运动物体/墙壁 需要添加刚体和碰撞体,如果有更便捷方便的方法欢迎在评论区指出一起学习参考哦!

展示图如下:


0 人点赞