思路就是发射射线,检测到物体的时候挂上一个springjoint组件,然后用linerenderer渲染joint两点之间连线。
用到的参数可能是这些(由于略微久远不记得有哪些细节参数)
//Hook
SpringJoint spring;
new public Camera camera;
//抓钩的绳子
LineRenderer lr;
//抓住的地点
Vector3 GrapPoint;
public Transform HookPoint;
public bool IsHook = false;
public float hookdistance = 10f;
public float Hookspring = 5f;
主要的抓钩代码:在update里面调用就行了。文章来源:https://www.toymoban.com/news/detail-525992.html
void Hook() {
RaycastHit hit;
//发射射线
Physics.Raycast(HookPoint.position, camera.transform.forward, out hit,hookdistance);
//判断IShook:有没有勾中,确保一次只能发射一条抓钩
if (Input.GetKeyDown(KeyCode.E) && !IsHook && hit.point != new Vector3(0, 0, 0))
{
IsHook = true;
//添加springjoint组件
spring = gameObject.AddComponent<SpringJoint>();
//自动锚点关闭
spring.autoConfigureConnectedAnchor = false;
//抓点为射线检测到的点
GrapPoint = hit.point;
//springjoint的connectedAnchor为GrapPoint,一定不是spring.connectedAnchor = transform.position详情可以看看组件的细节
spring.connectedAnchor = GrapPoint;
// spring.connectedAnchor = transform.position;下面这个可能用不到,但是以防万一我没删;
float distance = Vector3.Distance(HookPoint.position, GrapPoint);
spring.maxDistance = 0;
spring.minDistance = 0.1f;
//spring的力
spring.spring = Hookspring;
spring.damper = 4f;
spring.massScale = 4.5f;
//linerender的点数设置为2;
lr.positionCount = 2;
}
//抬起E,linerender的点数设置为0,ishook也设置为false,这样画线也不会有问题了。
else if (Input.GetKeyUp(KeyCode.E))
{
lr.positionCount = 0;
Destroy(spring);
IsHook = false;
//gameObject.
}
//这里我只是单纯地增加操作区间,上划滚轮可以拉长抓钩,可以不用,下面的操作也是;
if (Input.GetAxis("Mouse ScrollWheel")>0&&IsHook)
{
spring.maxDistance += 0.2f;
}
//这里也是,下滑滚轮绳子收的更快
else if (Input.GetAxis("Mouse ScrollWheel") < 0 && IsHook)
{
spring.maxDistance -= 0.2f;
}
//正在抓取时绳子一直在收缩
if (IsHook)
{
spring.maxDistance -= 1f*Time.deltaTime;
}
}
当然一定是要画线的,画线的方法是:注意放在lateupdate里面,不然会抽搐。文章来源地址https://www.toymoban.com/news/detail-525992.html
void DrawRope() {
if (!IsHook) return;
lr.SetPosition(0, HookPoint.position);
lr.SetPosition(1, GrapPoint);
}
到了这里,关于unity springjoint做一个抓钩的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!