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

Posted 呆呆敲代码的小Y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了100个 Unity实用技能 | 求反射向量的方法,让小球按照物理反射的角度反弹(出射角=入射角)相关的知识,希望对你有一定的参考价值。

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(入射向量,法向量)方法。

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

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

示例代码如下:

    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;
    

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

展示图如下:


以上是关于100个 Unity实用技能 | 求反射向量的方法,让小球按照物理反射的角度反弹(出射角=入射角)的主要内容,如果未能解决你的问题,请参考以下文章

100个 Unity实用技能| Unity中 检查当前设备网络状态 的几种方法整理

100个 Unity实用技能☀️ | Unity中 检查当前设备网络状态 的几种方法整理

100个 Unity实用技能| C# 检查字典中是否存在某个Key的几种方法

100个 Unity实用技能| Unity读取本地文件(Json,txt等)的三种方法示例

100个 Unity实用技能| Unity读取本地文件(Json,txt等)的三种方法示例

100个 Unity实用技能| Unity将本地图片文件显示到Image组件中 通用方法整理