You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity 2D俯视游戏Point Effector无重力引力效果实现求助

2D俯视视角行星引力实现方案(解决Point Effector无效问题)

先排查并修复Point Effector 2D的配置问题

如果想用Unity内置组件实现,先确认以下几个关键设置:

  • Collider2D必须配对:行星添加CircleCollider2D,勾选「Is Trigger」;玩家添加任意2D碰撞体(比如CapsuleCollider2D),两者的碰撞层要确保能相互触发(在Edit > Project Settings > Physics 2D里检查碰撞矩阵)。
  • Point Effector 2D正确配置:
    • 勾选「Use Gravity」,把Gravity Strength调到10-50之间(根据游戏手感调整)
    • 勾选「Force Fields」,将Force Magnitude设为0(避免额外推力干扰)
    • 调整Radius参数,设置引力的作用范围,超出这个范围玩家不受引力影响
  • 玩家Rigidbody2D设置:
    • Body Type必须设为「Dynamic」(Kinematic类型不会受effector影响)
    • Gravity Scale设为0,关闭默认重力
    • 在Constraints里勾选「Freeze Position Y」,保持俯视视角的平面移动

手动代码实现(更灵活可控)

如果内置组件还是不生效,或者需要更自定义的引力逻辑,直接写脚本实现:
给玩家挂载以下脚本(命名为PlayerGravity.cs):

using UnityEngine;

public class PlayerGravity : MonoBehaviour
{
    [Header("引力设置")]
    public float gravityStrength = 20f;
    public float maxGravityRange = 5f; // 引力最大作用距离
    private Rigidbody2D _rb;

    void Awake()
    {
        _rb = GetComponent<Rigidbody2D>();
    }

    void FixedUpdate()
    {
        // 通过Tag查找行星(提前给行星设置Tag为"Planet")
        GameObject planet = GameObject.FindGameObjectWithTag("Planet");
        if (planet == null) return;

        Vector2 toPlanet = planet.transform.position - transform.position;
        float distance = toPlanet.magnitude;

        // 超出范围则不施加引力
        if (distance > maxGravityRange) return;

        // 平方反比计算引力(距离越近引力越强,符合现实物理)
        float gravityMagnitude = gravityStrength / Mathf.Max(distance * distance, 0.1f);
        Vector2 gravityForce = toPlanet.normalized * gravityMagnitude;

        _rb.AddForce(gravityForce);
    }
}

然后确保玩家的Rigidbody2D是Dynamic类型、Gravity Scale为0、冻结Y轴位置即可。

内容的提问来源于stack exchange,提问作者Felipe Sancho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 16:00:11