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。
这样这个抛物线就做好了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

逐·風

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

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

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

打赏作者

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

抵扣说明:

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

余额充值