这几天我突发奇想 想要实现一个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
然后我的想法就是利用铰链关节来控制角色的移动 我们让角色勾住墙壁之后 可以类似荡秋千一样 荡过跳跃不过的沟壑