unity2D抛物线以及刚体加力进行弧度投射

5 篇文章 0 订阅

unity中2D的刚体也是存在向下的重力效果,在添加一定的力量的作用下就可以形成一个弧度的投射,然后在通过定义一个集合存放一个图片,将集合中的图片在力量所经过的路径上一次赋值,就会形成一个有弧度的抛物线,通过鼠标的拉扯,可以形成不同的力,显示出不同的抛物线弧度效果,下图则是效果的一个展现。
在这里插入图片描述
此效果的实现则是刚体加力后将力进行计算一次赋值给存放集合中的每一个物体后形成的效果。
以下则是我使用的代码:

	 public Rigidbody2D rg;
   	 public void zuoyongli(Vector2 lo)
   	 {
   	     rg.AddForce(lo,ForceMode2D.Impulse);//利用Rigidbody2D作用力物体
   	 }

这个是给物体的代码只需要将物体身上的刚体赋值给rg则可以了。

	public bar _bar;//物体身上的代码
    public Camera _main;
    public tir _tir;//存放集合的一个代码
    private bool m_isDragging;

    private Vector2 m_StartPosition;
    private Vector2 m_EndPositioin;
    private float logo;
    private Vector2 lixiangliang;
    private Vector2 fangxiang;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            m_isDragging = true;
            OnDragStart();
        }
        if (Input.GetMouseButtonUp(0))
        {
            m_isDragging = false;
            OnDragEnd();
        }

        if (m_isDragging)
        {
            OnDrag();
        }
    }

    /// <summary>
    /// 按下左键后
    /// </summary>
    private void OnDragStart()
    {
        m_StartPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        _tir.Show();
    }

    /// <summary>
    /// 持续按下左键
    /// </summary>
    private void OnDrag()
    {
        m_EndPositioin= Camera.main.ScreenToWorldPoint(Input.mousePosition);//赋值鼠标当前位置
        logo = Vector2.Distance(m_StartPosition, m_EndPositioin);//计算两者之间的距离
        fangxiang = (m_StartPosition - m_EndPositioin).normalized;
        lixiangliang = fangxiang * logo * 4f;//计算作用力大小
        _tir.updatefather(_bar.transform.position, lixiangliang);//给抛物线赋值
    }
    /// <summary>
    /// 抬起后
    /// </summary>
    private void OnDragEnd()
    {
        _bar.zuoyongli(lixiangliang);//将作用力赋值到物体上
        _tir.Hide();
    }

以上代码则是赋值给一个空物体,然后将物体与存放集合的空对象赋值则可以。

	public GameObject father;//本物体下定义一个空物体用来统一管理显示影藏
    public GameObject yu;//抛物线上每一个的预制体
    public Transform[] tran = new Transform[20];
    private Vector2 m_pos;
    private float m_time;
    // Start is called before the first frame update
    void Start()
    {
        float max = 1;
        float targer = max / tran.Length;//计算每个的大小
        for (int i = 0; i < tran.Length; i++)
        {
            var go = Instantiate(yu).transform;
            go.parent = father.transform;//实例化后设置父级
            go.localScale = Vector3.one * max;
            if(max>0.1f)
            {
                max -= targer;
            }
            tran[i] = go;//赋值集合
        }
        Hide();
    }
    /// <summary>
    /// 调用抛物线函数
    /// </summary>
    /// <param name="birdPos">物体所在的位置</param>
    /// <param name="pushSpeed">作用力</param>
    public void updatefather(Vector2 bird, Vector2 push)
    {
        m_time = 0.1f;
        for (int i = 0; i < tran.Length; i++)//所有的抛物线上的物体的位置挨个赋值
        {
            m_pos.x = (bird.x + push.x * m_time);
            m_pos.y = (bird.y + push.y * m_time) - 0.5f * Physics2D.gravity.magnitude * m_time* m_time;
            tran[i].position = m_pos;
            m_time+= 0.1f;
        }
    }

    /// <summary>
    /// 显示轨迹
    /// </summary>
    public void Show()
    {
        father.SetActive(true);
    }

    /// <summary>
    /// 隐藏预测轨迹
    /// </summary>
    public void Hide()
    {
        father.SetActive(false);
    }

将该代码赋值给存放集合的空物体则可以
在这里插入图片描述
这个是要投射的物体的组件设置
在这里插入图片描述
这个是集合存放的空物体的设置,不需要然后组件
在这里插入图片描述
这个是两者之间的一个空物体的设置,也不需要组件的加载,还有一些赋值,还有最关键的一个就是相机中组件的设置,不然会造成鼠标位置的一些误差。
在这里插入图片描述
将相机中这个设置后之后可以避免一些不必要的bug。
这样这个抛物线就做好了。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 在Unity中,要实现抛物线的精准打击,可以按照以下步骤进行操作: 首先,需要创建一个用于发射的游戏对象,并将其位置调整为发射点。然后,为该对象添加一个弹道脚本来控制其移动。 在弹道脚本中,需要定义发射角度和发射速度。可以通过用户输入或在代码中预设的参数来设置这些值。 接下来,在脚本中,使用刚体组件来控制游戏对象的运动。使用AddForce方法并通过Vector3来定义一个力,以模拟抛物线效果。 为了使抛物线更加精准,可以使用物理材料来控制游戏对象与其他碰撞体之间的摩擦和反弹效果。根据具体需求,可以调整物理材料的参数,例如摩擦系数和弹力系数。 为了实现打击效果,需要在目标位置创建一个碰撞体,当游戏对象与目标碰撞体接触时,触发一系列的事件或动作。可以使用OnCollisionEnter或OnTriggerEnter等方法来检测碰撞。 最后,可以根据游戏需求和目标效果,添加一些特效、音效或其他运动方式,以增强抛物线打击的视觉和听觉体验。 综上所述,在Unity中实现抛物线的精准打击,需要创建发射对象,设置发射角度和速度,使用刚体组件控制运动,并通过调整物理材料和检测碰撞实现打击效果。最后,可以添加其他特效来提升游戏体验。 ### 回答2: 在Unity中实现抛物线精准打击需要考虑到以下几个方面。 首先,在Unity中使用刚体组件(Rigidbody)来模拟物体的运动。刚体组件可以添加到要进行抛物线精准打击的游戏对象上,并通过设置质量、重力和阻力等参数来模拟物体的真实运动。 其次,我们需要计算物体的抛物线轨迹。可以通过代码来计算和更新物体的位置,在每个时间步长中,根据物体的初速度、发射角度和重力的作用,利用运动学公式计算物体的水平位移和垂直位移,从而实现抛物线运动的效果。 然后,我们可以根据玩家的输入来控制物体的发射角度和初速度。例如,可以使用鼠标点击事件来获取玩家点击的位置,然后根据这个位置计算发射角度和初速度,并将物体发射出去。 此外,为了实现抛物线精准打击,还可以考虑在物体的路径上添加碰撞体组件(Collision)。碰撞体可以用来检测物体与环境中其他对象或地形的碰撞,从而可以实现精确的打击效果。例如,在物体的抛物线轨迹中添加目标物体,一旦物体与目标物体发生碰撞,就可以触发击中效果。 最后,可以通过调试工具和调整参数来精调抛物线精准打击的效果。可以使用Unity提供的交互式调试工具来观察物体的运动轨迹和碰撞情况,从而进行调试和优化。 总之,在Unity中实现抛物线精准打击可以通过使用刚体组件,计算抛物线轨迹,控制发射角度和初速度,添加碰撞体组件以及调试优化等方法来实现。这样可以让游戏对象在物理引擎的控制下,以抛物线的方式精确地进行打击操作。 ### 回答3: 在Unity中实现抛物线精准打击需要以下步骤: 1. 创建一个角色或物体来执行抛物线打击。例如,创建一个游戏角色或投掷物体。 2. 为角色或物体添加刚体组件,以便使其受到物理引擎的影响。 3. 在角色或物体上添加Collider组件,以便与其他物体进行碰撞检测。 4. 在脚本中编写逻辑来计算抛物线轨迹。可以使用公式来计算轨迹,如二维自由落体运动的公式:y = v0 * t + 0.5 * g * t^2,其中y为上升高度,v0为初速度,t为时间,g为重力加速度。 5. 在Unity的Update函数中实时更新角色或物体的位置,根据计算出的轨迹来模拟抛物线运动。可以使用Transform组件的Translate函数来移动角色或物体。 6. 在角色或物体和其他物体进行碰撞检测时,通过OnCollisionEnter或OnCollisionStay函数来判断是否击中目标。可以使用Collider组件的bounds属性来检查碰撞。 7. 在击中目标时,执行相应的动作或触发事件。例如,计算伤害、播放特效等。 需要注意的是,实现抛物线精准打击需要考虑多个因素,如重力、初速度、角度、阻力等。这些因素需要根据具体情况进行调整和优化,以达到最佳的效果。同时,还需注意预测目标的移动轨迹,以提高准确性。通过不断调试和优化,可以实现更加精准的抛物线打击效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逐·風

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值