【Unity】两种方式实现弹跳平台/反弹玩家(玩家触发与物体自身触发事件实现蹦床的物理效果)

这篇具有很好参考价值的文章主要介绍了【Unity】两种方式实现弹跳平台/反弹玩家(玩家触发与物体自身触发事件实现蹦床的物理效果)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、声明

只实现物理反弹的效果,不实现蹦床会有的视觉拉伸效果,请自行找相关代码

二、实现

经过我的实践,我发现要想实现一个平台反弹的效果,要么就选择给player添加一个物理材质(平台加了没用),
【Unity】两种方式实现弹跳平台/反弹玩家(玩家触发与物体自身触发事件实现蹦床的物理效果),Unity玩玩就算了,狗都不用,unity,游戏引擎,c#

但是这样会造成一个问题,如果我们要弄一个3d控制器的游戏,那么没理由让玩家什么情况下都要弹起来吧。

2.1 老手操作

因此参考这篇优质文章https://blog.csdn.net/LLLLL__/article/details/117266549
我们可以给玩家移动代码中添加如下的代码 :
注意

  • 应避免使用contacts[0],因为它会产生内存垃圾。改用 GetContact GetContacts,即other.GetContact(0).normal
	private Vector3 lastDir;
	private void LateUpdate()
    {
        lastDir = rb.velocity;
    }

    private void OnCollisionEnter(Collision other)
    {
        if (other.gameObject.tag == "Wall")
        {
            Vector3 reflexAngle = Vector3.Reflect(lastDir, other.contacts[0].normal);
            rb.velocity = reflexAngle.normalized * lastDir.magnitude;
        }
    }

2.2 新手操作

下面的选择则是挂载到我们的平台上。
注意
playerRigidbody是在OnCollisionEnter方法中声明的,因此它的作用范围仅限于OnCollisionEnter方法,这会导致编译错误。
要解决这个问题,可以将playerRigidbody声明为类级别的字段,以便在整个类中都能访问它。
同时,还需要在OnCollisionEnter方法中获取到playerRigidbody

using UnityEngine;

public class Bounch_Platform : MonoBehaviour
{
    private Vector3 lastDir;
    private Rigidbody playerRigidbody; // 声明为类级别字段

    private void OnCollisionEnter(Collision other)
    {
        // 检测是否碰到了玩家(假设玩家有一个标签为 "Player")
        if (other.gameObject.CompareTag("Player"))
        {
            playerRigidbody = other.gameObject.GetComponent<Rigidbody>(); // 获取玩家的刚体
            if (playerRigidbody != null)
            {
                Vector3 reflexAngle = Vector3.Reflect(lastDir, other.GetContact(0).normal);
                // 应用反射角度来实现弹跳
                playerRigidbody.velocity = reflexAngle.normalized * lastDir.magnitude;
            }
        }
    }

    private void LateUpdate()
    {
        if (playerRigidbody != null)
        {
            lastDir = playerRigidbody.velocity;
        }
    }
}

三、额外注意事项

3.1 使用触发事件的问题

  • 注意碰撞体Collider和碰撞Collision不是同一个东西,有些人可能会考虑使用触发事件(假设已经点了is trigger),去完成这个反弹效果。
  • 但是请注意了,如果在unity中的实现,如果分开碰撞体和刚体组件就会造成这个触发问题(如下图

【Unity】两种方式实现弹跳平台/反弹玩家(玩家触发与物体自身触发事件实现蹦床的物理效果),Unity玩玩就算了,狗都不用,unity,游戏引擎,c#

Tip
我们实现物理移动,rigidbody组件是一定要选择跟我们的脚本挂载到同一个游戏对象,碰撞体在什么位置反而无所谓,只是不要想着可以通过GetComponentInChildrenGetComponentInParent取巧解决上面的结构问题,这样会造成不必要的工作量。

3.2 老手和新手操作的区别点

游戏是由事件驱动的,比如OnCollisionEnterOnTriggerEnter,对涉及到碰撞的事件可以通过以下两种方法实现:

  • 玩家触发,通过对tag的识别,更好的理解就是:我碰到小明,所以小明叫了我
  • 物体自身触发事件,也是对tag的识别,但是由物体自己主导,可以理解成:小明被我碰到了,所以叫了我

老手的操作并不代表这一定好,只是这样更适合更加小型的项目,更方便我们聚合tag在一起,而如果我们选择把一个物体当成一个模块,意味着可以复用这些类型的预制体。

一旦使用老手的操作,如果遇到需要改动或者弃用某些对象,可能会影响到相关的事件的判断,而且unity也对tags改名操作和弃用操作也不智能,选择新手的方式无疑更好。

四、最终效果

【Unity】两种方式实现弹跳平台/反弹玩家(玩家触发与物体自身触发事件实现蹦床的物理效果),Unity玩玩就算了,狗都不用,unity,游戏引擎,c#文章来源地址https://www.toymoban.com/news/detail-728739.html

到了这里,关于【Unity】两种方式实现弹跳平台/反弹玩家(玩家触发与物体自身触发事件实现蹦床的物理效果)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在 Unity 中,添加组件的两种方式

    在 Unity 中,添加组件有两种方式 在 Unity 中,添加组件有两种方式:一种是在 Inspector 窗口中手动将组件拖拽到对象上,另一种是通过代码进行添加。在这段代码中,通过 AddComponent 函数在 clude 对象上添加了 CloudsMove 组件,这是通过代码进行添加的方式。 与手动添加组件相比

    2024年02月15日
    浏览(44)
  • [unity] 音频的二进制流转化为audioclip的两种方式

    1、将返回的byte[]数组,转换成float[]数组,然后将通过 audioSource.clip.SetData()方法,将音频数据赋给audiosource,实现语音播放;但这种只有wav很有可以直接用mp3需要第三方库,我没有试过 mp3的请参考:https://blog.csdn.net/L877790502/article/details/119042479 2、将返回的btye[]数组,使用file

    2024年02月11日
    浏览(47)
  • Unity3D教程:播放视频的两种方式

    Unity3D 中播放游戏视频的方式有两种,第一种是在游戏对象中播放,就好比在游戏世界中创建一个Plane面对象,摄像机直直的照射在这个面上。第二种是在GUI层面上播放视频。播放视频其实和贴图非常相像,因为播放视频用到的MovieTexture属于贴图Texture的子类,那么本章我们就

    2024年02月11日
    浏览(39)
  • unity通过脚本实现漫游功能 wasd控制玩家移动,空格跳跃,鼠标控制视野旋转,滑轮控制镜头伸缩

    将场景中的摄像机删除,在玩家的控制面板中添加Camera组件,和rigibody组件   using System.Collections; using System.Collections.Generic; using UnityEngine; public class move : MonoBehaviour {     public float speed;     Rigidbody rigid;     void Start()     {                 rigid = GetComponentRigidbody();     }  

    2024年02月10日
    浏览(44)
  • Unity内打开网页的两种方式(自带浏览器、内嵌浏览器)

    这个比较简单,直接调用unity官方的API即可,会直接使用默认浏览器打开网页,这里就不多做解释了。 代码 该方案是使用unity store里的插件实现的。 插件链接 使用该插件不会切出APP。 示例效果 注意此时是没有切出游戏的。 测试代码 实现具体需求参考插件文档即可,还是蛮

    2024年02月05日
    浏览(41)
  • springboot整合微信(公众号)实现扫码登录(两种方式,两种实现)

    首先说一下这个微信扫码登录它的方式有两种,一种是基于网页的redirect实现,一种是基于公众号推送消息实现, 二者实现的效果是不一样的 贴一个官方文档 需要有自己的域名 (这里你可以使用内网穿透,会生成一个自己的域名,网上一大堆,自己奥利给吧) 需要申请微信认

    2024年01月18日
    浏览(94)
  • el-date-picker实现通过其他方式触发日期选择器

    el-date-picker 目前只能通过点击input输入框触发日期选择器,项目中需要通过其他方式触发日期选择器同时把input输入框去掉,如点击另一个按钮事件 来触发日期选择器框展开。 该模块由于后端接口数据传输限制 在前面文章里做了些许改动。 需求左右切换 可以快速找到年份,

    2023年04月08日
    浏览(39)
  • vue实现导出excel的两种方式

    通过vue实现导出有两种方式: (1)后端返回的是一个地址,直接拼接打开下载就行 (2)后端返回的是文件流的形式,这个时候就需要在请求头还有返回值的地方设置一下 (1)设置请求头 (2)设置返回结果,处理返回我文件流 (3)附加说明 有的时候做到上述几步还是不

    2024年02月12日
    浏览(48)
  • 两种实现WebSocket的方式,基于Java实现WebSocket。

    首先我们声明WebSocker方便打字为ws。 WebSocker ws = new WebSocket(); 或者说启用spring框架,因为spring已经整合了ws。 配置类:把spring中的ServerEndpointEx porter对象注入进来 用iava注解来 @ServerEndpoint          监听连接、 @OnOpen          连接成功、 @OnClose        连接关闭、 @

    2024年01月21日
    浏览(44)
  • echarts实现3d柱状图的两种方式

    看了不少关于3d柱状图的案例,发现做3d柱状图 常用的两种方式就是 自定义图形和象型柱图, 两种实现方式效果如下: 方法1: echarts.graphic.extendShape 自定义图形 echarts自定义图形的详细用法点这里, 官网点这里, 图中第一个3d柱状图我参考的案例在这里, 看了很多 echarts这种3d案例,

    2024年02月01日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包