Unity3D_类捕鱼项目,子弹反弹效果实现

第一人称视角移动——刚体遇碰撞体产生反弹 在使用第一人称控制人物移动过程中,每次当代表人物的胶囊体和墙壁或场景中模型的碰撞体进行碰撞时,人物会被反弹,并且会进行旋转。 阅读详情

子弹反弹示意图如下:

1.墙体与子弹均为碰撞体

2.前提条件:需要知道子弹前进方向向量,墙体方向向量

3.计算简易过程,黄色为子弹方向向量,计算出与墙的夹角,根据入射角等于反射角算出橙色方向向量。此时只是子弹方向改变了,接下来还要算出位置的偏移量,根据与墙夹角与子弹本身的大小由三角函数sin/cos算出偏移量,最终效果如红色箭头。

代码:

-- 子弹反弹,ColliderObj:碰撞墙体共4面. 
-- self.bulletObjLength为子弹长度估算值, self.Dir为子弹当前的方向向量, self.o_Transform为子弹实例
function BCAmmoBase:ReflectBullet(ColliderObj)

    -- inNormal: 墙体方向向量,用于计算反射角,为法线
    -- XOrZ: 判断子弹碰撞为水平墙体还是垂直墙体
    -- iden: 子弹所碰撞墙体的标识,用于记录上次碰撞的墙体
    local inNormal, XOrZ, iden = nil
    if tostring(ColliderObj.transform.name) == "ForwardWall" then
        inNormal = Vector3(0, 0, -1)
        XOrZ = true
        iden = "F"
    elseif tostring(ColliderObj.transform.name) == "BackWall" then
        inNormal = Vector3(0, 0, 1)
        XOrZ = true
        iden = "B"
    elseif tostring(ColliderObj.transform.name) == "LeftWall" then
        inNormal = Vector3(1, 0, 0.1)
        XOrZ = false
        iden = "L"
    elseif tostring(ColliderObj.transform.name) == "RightWall" then
        inNormal = Vector3(-1, 0, 0.1)
        XOrZ = false
        iden = "R"
    end

    if inNormal == nil or iden == nil then
        -- log("inNormal == nil or iden == nil ")
        return
    end

    -- 为了避免子弹飞出墙体,同一墙体禁止反弹多次
    if iden == self.collideLastIden then
        -- log("iden == self.collideLastIden ")
        return
    end

    self.collideLastIden = iden
    self.collideInNormal = inNormal
    self.collideXOrZ = XOrZ

    local reflexDir = Vector3.Reflect(self.Dir, self.collideInNormal)
    local dirAngle = 90 - Vector3.Angle(reflexDir, self.collideInNormal)
    local dic = math.sin(math.rad(dirAngle)) * self.bulletObjLength 
    
    -- log(tostring(reflexDir) .. "  反射向量")
    -- log(tostring(dirAngle) .. "  反射向量与位置矫正的夹角")
    -- log(tostring(dic) .. "  位置矫正")

    -- 位置矫正
    local pos = self.o_Transform.position
    if self.collideXOrZ then
        self.o_Transform.position = reflexDir.x >= 0 and pos + Vector3(dic, 0, 0) or pos - Vector3(dic, 0, 0)
    else
        self.o_Transform.position = reflexDir.z >= 0 and pos + Vector3(0, 0, dic) or pos - Vector3(0, 0, dic)
    end

    -- 方向矫正
    local dir = Vector3.Normalize(reflexDir)
    self.Dir = Vector3(dir.x, 0, dir.z) -- Y轴固定为0,避免子弹上仰或者下倾
    self.o_Transform.rotation = Quaternion.FromToRotation(Vector3.forward, self.Dir)
end

Unity3D捕鱼游戏开发实战:从对象池到性能优化的完整指南 在游戏开发领域,对象池技术是优化性能的核心概念之一,它通过复用游戏对象来避免频繁的实例化与销毁,从而减少垃圾回收压力,提升游戏运行流畅度。其原理是预先创建对象集合,使用时激活,用毕回收,这尤其适用于子弹、鱼类等高频生成的对象。这项技术的价值在于能显著降低CPU开销,是开发高帧率、大数量实体游戏的关键。在捕鱼游戏这类需要同屏处理大量动态元素的经典街机复刻项目中,对象池与碰撞检测优化、UI动效管理共同构成了技术基石。本文聚焦Unity3D引擎,深入探讨如何运用对象池、优化2D物理碰撞,并结合DOTween实现流 阅读详情

相关推荐

unity实现弹射子弹

unity实现弹射子弹,子弹在不同敌人之间来回弹射,发射自动选择最近的敌人,然后每次随机选择附近的敌人进行弹射,可以控制弹射次数,比如3次后子弹销毁可以通过以下步骤在Unity中实现弹射子弹的效果:1.创建一个子弹对象和敌人对象,并在子弹对象上添加一个控制脚本BulletController,用于控制子弹的弹射行为。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3347

Unity子弹反弹效果实现

unity实现2D子弹碰撞反弹,高速度子弹也有可以用的方法。

WEIWEI6661012的博客 3922

Unity中实现反弹

一:演示视频 二:代码实现 using UnityEngine; public class Player : MonoBehaviour { private void Update() { transform.Translate(transform.forward * Time.deltaTime * 30, Space.World); } private void OnCollisionEnter(Collision other) {

L的博客 7303

Unity3D_类捕鱼项目,控制碰撞墙体之间距离以适配不同机型

背景,最近接手一个项目,类捕鱼游戏,需求是子弹发射后可以在四周墙体内反弹,关于反弹可以参考我另一篇文章。由于不同机型屏幕高宽比不同,所以要适配墙体之间的距离。众所周知,U3d的Camera相机在视口发生改变时,上下边缘是不变,只有左右边缘会互相靠近或远离。手机屏幕同理,宽屏手机下左右边缘相继较远,平板手机则是左右边缘相继较近。因此知道手机屏幕分辨率后,接下来只要改变黄色箭头的墙体就行了 ...

Le_Sam的博客 748

麒麟V10桌面操作系统安装Qt5.12.3

在虚拟机中如何安装麒麟V10桌面系统,以及在麒麟系统中安装Qt框架,并正常编译运行Qt程序

阿龙的思考 3599

南京邮电大学电工电子实验(二)复习一

本文给电工电子实验(二)的复习进行一些知识点的提醒

YOUXISUN的博客 2959

Unity 物体碰撞墙体后反弹

反弹 求反射角

jennys_name的博客 2024

PCRNet: Point Cloud Registration Network using PointNet Encoding

PCRNet算是在ModelNet40这种object-centric数据集上用deep-learning做配准最好入手的一篇文章了,整体架构涉及简洁明了,一句话描述就是简单粗暴,话不多说,直接上网络架构图: Work Flow: 首先对输入source (N×3N \times 3N×3)与template (M×3M \times 3M×3)进行PointNet操作,即MLP + max-pooling后,分别得到描述各自点云的维度为1024的global feature vector:Φ(PS).

dloading7的博客 1648

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

unity中物体碰撞反弹

qq_42540393的博客 5745

手把手调试Altera FPGA远程升级:从ASMI扇区擦除到Remote Update IP配置的避坑实录

本文详细解析了Altera FPGA远程升级的全流程,重点介绍了Cyclone IV系列FPGA的ASMI扇区擦除和Remote Update IP配置的实战技巧。通过双镜像架构设计、ASMI IP核优化配置及Remote Update IP的隐藏参数设置,帮助开发者避免常见陷阱,提升远程升级的可靠性和效率。

weixin_30872499的博客 447

《点云处理算法》——GROR配准

GROR点云配准

阁楼 1315

Unity常用2D子弹弹幕以及枪械类型的实现:可实现霰弹枪,Boss弹幕,子弹反弹,追踪弹等

本文介绍了常用武器和子弹的简易实现方式

m0_72922928的博客 5079

手把手教你学Simulink——基于Simulink的PR(比例谐振)控制器在单相整流中的应用

本文详细介绍了基于Simulink的PR(比例谐振)控制器在单相整流系统中的应用。通过与传统PI控制器的对比,阐述了PR控制器在交流信号跟踪中的优势:可实现50Hz正弦电流的无静差跟踪,THD低于2%,功率因数接近1。文章从PR控制器原理出发,提供了Simulink建模的具体步骤,包括主电路搭建、电压外环设计、PR控制器实现方法(推荐MATLAB Function方式)以及SPWM调制。通过仿真验证了PR控制在稳态和负载突变情况下的优越性能,并探讨了工程实践中的电网频率自适应、多谐振PR等关键技术。该教程为

MHD0815的博客 123

Unity3D -- 物体反弹碰撞

设置Unity物体碰撞时的反弹系数:也即Physic Material的 Bounciness属性。只需要给物体的Collider添加Material属性即可。 创建一个Physic Material  Asset -> Create->Physic Material(Physic Material 2D) 设置Bounciness这个属性,区间是0到1,0:没有弹力,1

阳仔博客 1万+

让 ABAP Screen Variant 安稳上车:SHD0 与 SHD0_MANDT 的 Transport 全攻略

摘要: SAP项目常需优化交易码界面,通过SHD0的Transaction Variant和Screen Variant可实现字段精简、默认值预设及权限控制,避免修改标准代码。但跨系统迁移时易出现变式丢失或版本兼容问题。核心概念包括: Screen Variant:针对单个屏幕的字段属性配置(跨Client); Transaction Variant:串联多屏幕变式(分跨Client和Client-specific); 版本差异:4.70/6.x后需区分SHD0(跨Client)与SHD0_MANDT(Cl

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 230

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

在程序中有时候会用到某物体遇到墙壁之后按照物理学角度进行弹射的功能,也就是利用 入射角=出射角 模拟物理反射。 这里我们利用Unity的碰撞检测来实现具体功能,当物体撞击到墙壁之后调用GetContact(0)拿到该物体第一个发生碰撞的接触点坐标的法向量,然后调用 Vector3.Reflect(入射向量,法向量)方法。 入射向量 就是该物体原来移动的向量,将这两个向量传入,即可求出反射向量,然后将该物体的移动方向改为求得的反射向量即可实现弹射功能。

努力前行,总会成为自己心中的那道光 2万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Unity3D-模拟物理完全弹性碰撞反弹

根据入射方向得到反射方向,并保留相同速率 private Vector3 m_preVelocity = Vector3.zero;//上一帧速度 public void OnCollisionEnter(Collision collision) { if (collision.gameObject.name == "wall") {

游戏人生 3万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

通过反射原理实现2d游戏的子弹反弹

不使用物理引擎,通过cocos creator2.4.11游戏引擎实现物体碰撞反弹,只用到了引擎自带的碰撞组件

qq_34948188的博客 2072

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【unity】用代码实现“碰到障碍后 运动对象的运动方向如何改变(反弹/滑行)”

向右下方【↘️】移动的对象,碰到右侧的墙壁 【↘️| 】 后,继续沿着着墙壁向下方移动【↓ | 】

99的博客 2585

捕鱼场景中子弹反弹效果的实现

捕鱼场景中子弹反弹效果的实现 目录 捕鱼场景中子弹反弹效果的实现 前言 核心代码: 代码分析: 前言 在捕鱼游戏中设计子弹时实现的反弹效果,这里做一个总结,方便以后在其他游戏中要实现同样的功能时查阅参考。 核心代码: private void OnTriggerEnter(Collider other) { if (other.tag == "Wall")//撞墙反弹 { float fFlag = -1.0f;

qq_37160769的博客 1013

6.Unity2D 横版 受击反馈+跟随血条+延时/延迟扣血+协程的应用

Unity2D 横版 受击反馈+跟随血条+延时/延迟扣血+协程的应用在我的程序里,我也使用了攻击碰撞盒的建立。并且是通过受击动画和击退来完成受击反馈的。最后通过协程来结束受击判定条件。当然根据大佬的教程来说,如果并没有受击动画的话,咱们可以改变动画播放速度+协程调回原来的速度和改变精灵图变白色来进行受击反馈。由于血条需要移动,如果用UI的话(UI必须放在画布下面且固定),需要计算坐标,很难处理。所以直接加上去血条作为角色的子体更加方便,我们需要创建一个血条空对象。然后在血条项下加入最大血条,延迟扣血血条和目

雾狼的游戏屋 4366

unity2D学习(12)角色发射子弹

1 子弹 2 枪口

qq_40306845的博客 1万+

球碰撞反弹拖尾踩坑

最初使用的是TrialRender+物理材质来做的反弹拖尾,但是拖尾有问题,如图所示,出现了穿透的问题。 检查了一下,原来是CollisionDetection设置为Discrecte,将CollisionDescrecte改为Continue之后又出现了未触边界就反弹的问题。 于是,想到不使用物理反弹材质,自己写反射逻辑,代码如下: Vector2 inDirection; public void SetInDirection(Vector2 pos) { ...

yq398934906的博客 450

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

玩家触发与物体自身触发事件实现蹦床的物理效果

kokool的博客 2182

Unity中子弹反弹效果的制作

最近在做一个射击游戏,需要做子弹的反弹效果:即

November2013的专栏 8579
上一篇: Shader 基本UV操作,平移,旋转,缩放
下一篇: Unity3D_类捕鱼项目,控制碰撞墙体之间距离以适配不同机型
Le_Sam
博客等级 码龄11年 342粉丝 53原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值