unity2D开发钩绳枪效果(2D射线检测 铰链关节 Linerenderer组件的使用)

这几天我突发奇想 想要实现一个2D的钩绳枪
但是实现过程可以说是十分坎坷了 遇到了好多意料之外的问题

然后这篇博客 给大家介绍一下遇到的坑 以及我对于钩绳枪的想法
首先 我想到的是在玩家本身发射2D的射线 方向朝着鼠标的方向
这就是一个困扰我很久的 一个问题
因为坐标系的不同
2D射线和3D的用法几乎不同 所以花了一段时间
Physics2D.Raycast(发射位置, 发射方向,距离);
这个很大程度的区别于3D的用法

还有就是大家也可能遇到2D射线检测不到的情况
这个问题很大可能是坐标的原因 坐标的z轴必须为0
如果不为0 当然会检测不到

解决了这个问题 然后就是鼠标方向的问题了
我看了很多大佬的博客 很多都不能用 最后终于研究出来了
其实思路非常非常简单的 就是用转换后的2D鼠标坐标 和主角坐标作差
即可得到方向(是有大小的) 然后单位化

下面我给出代码

 private Vector3 targetpos;
    private LineRenderer linerenderer;
    private void Start()
    {
        linerenderer = GetComponent<LineRenderer>();
    }
    void Update()
    {
        if (Input.GetMouseButton(0))
        {        
             Vector3 mouse = Input.mousePosition;
            Vector3 obj = Camera.main.WorldToScreenPoint(transform.position);
            //屏幕坐标向量相减,得到指向鼠标点的目标向量,即黄色线段
             Vector3 direction = mouse - obj;
             //将Z轴置0,保持在2D平面内
             direction.z = 0f;
            //将目标向量长度变成1,即单位向量,这里的目的是只使用向量的方向,不需要长度,所以变成1
             direction = direction.normalized;
            transform.up = direction;
            RaycastHit2D hit = Physics2D.Raycast(transform.position+new Vector3(0,0.1f,0), direction);
            if (hit.collider.tag=="Upwall"&&hit.collider!=null)
            {
                targetpos = hit.point;
                Debug.LogError("meicuo ");
            }
            linerenderer.SetPosition(0, transform.position);
            linerenderer.SetPosition(1, targetpos );
        }
        else if (Input.GetMouseButtonUp(0))
        {
            linerenderer.SetPosition(0, transform.position);
            linerenderer.SetPosition(1, transform.position);
        }
    }

我在unity中做了一个墙 标签(tag)为Upwall 可以被绳子勾住

效果图(我用之前的超级玛丽项目来做的 纯属因为懒 懒得再去写一遍角色控制器等了)这堵墙的标签就是Upwall

在这里插入图片描述

然后我的想法就是利用铰链关节来控制角色的移动 我们让角色勾住墙壁之后 可以类似荡秋千一样 荡过跳跃不过的沟壑

发布了88 篇原创文章 · 获赞 101 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_44302602/article/details/105644442