Unity 场景中不同分辨率下相机可滑动边界问题

场景相机可滑动的边界

在这里插入图片描述
如图,我希望把相机左右移动来查看全部场景的内容,但是在移动过程中又不能超过场景的边界,这个时候我们需要设置相机的边界值,我一开始想到的方式是给定两边一个一值,移动的时候判断相机的X坐标在不在设定的范围之内。这样做法是有问题的,比如我当前的设置的分辨是19201080相机移动的边界刚刚好,
在这里插入图片描述
当我的分辨率和我的标准分辨不一样的时候问题就出现了比如这样的情况:分辨率 :2160
1080
在这里插入图片描述
你会发现相机的的可视范围超过了场景范围,在这里插入图片描述
因为我们是不改变相机和场景的距离和相机的视图夹角,所以就需要算出当前分辨率和标准分辨率下他们之间X的偏移的差值。在计算差值过程中,又碰到了一个问题,因为相机的高度和宽度都会影响到这个偏移的值。也是有两个变量。我们需要先算一个值,在算计另一个值。只恨高中数学没有学好。找不出合理的方程式。

另辟捷径

思考了好几天,之前都在想计算偏移的方程式,在一个谈论到射线检测中,突发奇想:我可以在场景中加入两个临界的碰撞体,判断这两个碰撞体在不在相机范围内就可以了,如果在相机范围内,则相机就移动到了边界。
在这里插入图片描述
检测代码

    // 是否超过了场景的边界
    public bool IsExceedSceneBoundary()
    {
        GameObject go = GameObject.Find("CJ/Colliders/Buildings/you");
        GameObject go1 = GameObject.Find("CJ/Colliders/Buildings/zuo");
        if (go == null || go1 == null)
        {
            return true;
        }

        Vector3 tmp = TPCamera.instance.mainUICamera.WorldToScreenPoint(go.transform.position);
        if (tmp.x > 0 && tmp.x < Screen.width)
        {
            return true;
        }

        Vector3 tmp1 = TPCamera.instance.mainUICamera.WorldToScreenPoint(go1.transform.position);
        if (tmp1.x > 0 && tmp1.x < Screen.width)
        {
            return true;
        }
        return false;
    }

使用向量的点剩

点乘公式
在这里插入图片描述
在这里插入图片描述
取边界点的法向量和相机的法向量,根据公式算出夹角,在和相机的视角比较,也能判断边界。

<think>嗯,用户问的是抖音里那个停车小游戏的主要逻辑和Unity开发中的技术难点。首先,我需要先理解这个停车小游戏具体是什么样的。可能是一个模拟停车的小游戏,玩家需要把车停到指定位置,不能碰撞,可能还有时间限制或者关卡设计。 主要逻辑方面,应该包括车辆的控制,比如前进、后退、转向,还有碰撞检测,判断是否碰到障碍物或者其他车辆。然后,游戏的目标是停到正确的位置,可能需要检测车辆是否停在指定区域,并且方向角度是否正确。物理引擎的使用也很关键,车辆的移动需要模拟真实的物理效果,比如加速度、摩擦力等。另外,关卡设计可能涉及不同难度的停车场布局,还有得分系统、时间限制、教程提示这些元素。 接下来是Unity的技术难点。首先,物理模拟部分,车辆的运动要真实,可能需要调整Rigidbody的参数,比如质量、阻力,防止车辆打滑或者翻车。转向系统也需要处理,比如前轮转向和后轮驱动的区别,可能需要写自定义的脚本控制车轮的旋转和转向角度。 碰撞检测方面,Unity虽然有碰撞器,但车辆形状复杂的话,可能需要组合多个碰撞器,或者使用Mesh Collider,但得注意性能。停车区域的检测可能需要触发器,判断车辆的位置和旋转角度是否在允许范围内。特别是旋转角度的计算,可能需要用四元数转欧拉角,然后检查y轴旋转是否接近目标值。 摄像机控制也是个问题,车辆在狭小空间移动时,相机要跟随但避免穿墙,可能需要用Cinemachine插件,设置虚拟相机和碰撞检测,让相机自动调整位置。或者分屏显示,如果有多辆车的话。 关卡编辑器方面,如果有很多关卡,可能需要设计一个可视化的工具,让策划人员方便摆放障碍物和停车点,可能需要自定义编辑器脚本,或者用ScriptableObject来存储关卡数据。 性能优化方面,特别是移动端,抖音用户多是用手机,所以要注意Draw Call、物理计算的开销,可能需要做对象池管理障碍物,或者LOD减少渲染负担。还有内存管理,避免频繁的Instantiate和Destroy导致内存碎片。 另外,触控输入的优化,比如方向盘和按钮的响应,可能需要处理多点触控,防止误操作。UI的适配不同屏幕比例,确保按钮位置合适,不会遮挡游戏画面。 可能还需要考虑网络功能,比如保存进度到云端,或者分享成绩到社交平台,但抖音本身可能有接口,需要集成SDK。还有广告的接入,在关卡之间插广告,需要处理广告加载和显示的逻辑。 测试方面,不同设备的兼容性,尤其是Android碎片化问题,不同分辨率和性能的手机上是否流畅。还有处理异常情况,比如应用暂停时的游戏状态保存,防止崩溃。 总结一下,主要逻辑是车辆控制、碰撞检测、停车判定、物理模拟和关卡设计。技术难点集中在物理模拟的真实性、碰撞检测的准确性、摄像机控制、性能优化和输入处理。需要深入使用Unity的物理系统,合理设计架构,并进行充分的测试和优化。</think>### 抖音停车小游戏的主要逻辑分析 #### 1. **核心玩法** - **目标**:玩家需将车辆精准停入指定车位,满足位置、角度和碰撞限制条件。 - **操作**:虚拟方向盘(滑动控制)+ 油门/刹车按钮,部分版本支持重力感应。 - **规则**: - **碰撞惩罚**:触碰障碍物或超出时间限制会导致失败。 - **星级评分**:根据停车速度、操作流畅度(如转向次数)动态评分。 #### 2. **系统模块** - **物理引擎**:Unity Rigidbody模拟车辆动力学,需定制化参数: ```csharp wheelCollider.motorTorque = motorForce * inputVertical; // 动力输出 wheelCollider.steerAngle = maxSteerAngle * inputHorizontal; // 转向角度 ``` - **碰撞检测**: - 分层检测:通过LayerMask区分可碰撞物体(障碍物)与触发器(停车区) - 多边形碰撞器:复杂车身使用PolygonCollider2D贴合轮廓 - **停车判定**: ```csharp bool IsParked(Vector3 carPos, Quaternion carRot){ float angleDiff = Quaternion.Angle(carRot, targetRot); return (BoundsContains(targetArea, carPos) && angleDiff < 5f); } ``` - **关卡系统**:ScriptableObject存储关卡数据(障碍坐标、车位坐标、初始朝向) --- ### Unity开发技术难点与解决方案 #### 1. **物理模拟优化** - **问题**:移动端性能限制下真实物理表现困难 - **解决方案**: - 简化车辆模型:使用WheelCollider仅模拟关键受力点 - 固定时间步长调整:`Time.fixedDeltaTime = 0.02f` 平衡精度与性能 - 质量分布优化:通过Rigidbody.centerOfMass调整重心防侧翻 #### 2. **多平台输入适配** - **问题**:触屏操作精度要求高(特别是侧方位停车) - **方案**: ```csharp // 方向盘灵敏度动态调整 float sensitivity = Mathf.Lerp(0.3f, 1.2f, currentSpeed/maxSpeed); steerInput = TouchDelta.x * sensitivity; ``` - 加入输入缓冲:操作指令0.1秒延迟执行避免过度转向 #### 3. **摄像机智能跟随** - **难点**:狭小空间内视野自动调整 - **实现**: - Cinemachine Confiner组件设置场景边界 - 动态切换相机模式: ```csharp if(IsInTightSpace()){ cameraBrain.m_DefaultBlend.m_Time = 0.5f; // 平滑过渡 SwitchCamera("CloseFollow"); } ``` #### 4. **性能瓶颈突破** - **优化策略**: - 批处理渲染:合并静态障碍物的材质实例 - LOD系统:远距离车辆切换低模 - 对象池管理: ```csharp ObjectPool.GetPool("Obstacles").Spawn(prefab, position); ``` #### 5. **数据驱动设计** - **关键技术**: - 使用Addressables实现资源动态加载 - JSON配置表定义关卡参数: ```json { "level": 5, "obstacles": [ {"x": 2.5, "y": -1.3, "type": "cone"}, {"x": -1.8, "y": 3.2, "type": "wall"} ], "timeLimit": 45 } ``` --- ### 行业实践参考 - **《泊车大师》技术方案**:采用ECS架构提升物理计算效率,10万+动态物体同屏 - **Unity DOTS实践**:Burst Compiler + Job System实现多线程物理计算 - **触觉反馈增强**:集成Android Vibration API提供碰撞震动反馈 该类型游戏需在拟真度与娱乐性间取得平衡,通过技术手段降低学习成本的同时保持核心挑战性,是抖音小游戏矩阵中典型的轻度竞技品类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值