Question by
ZappyLeader5615 · May 07 at 04:14 PM ·
3dgravityspringjointgrappling gunspring joint
Spring Joint Grappling Hook help please
so I am trying to make the grappling gun in this video: https://www.youtube.com/watch?v=Xgh4v1w5DxU and I finished the code and everything, but I've ran into a problem. when I grapple onto an object, I swing normally until it just slows to an almost stop (still moving, verrrrrrry slowly). I'm not sure whats causing this. Any help would be appreciated.
video of whats happening cuz its hard to explain: https://youtu.be/FdW_euqCKF4
my code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GrapplingGun : MonoBehaviour
{
private LineRenderer lr;
private Vector3 grapplePoint;
public LayerMask whatIsGrappleable;
public Transform gunTip, camera, player;
private float maxDistance = 100f;
private SpringJoint joint;
public Rigidbody rb;
void Awake() {
lr = GetComponent<LineRenderer>();
rb = player.GetComponent<Rigidbody>();
}
void Update() {
if (Input.GetMouseButtonDown(0)) {
StartGrapple();
}
else if (Input.GetMouseButtonUp(0)) {
StopGrapple();
}
}
//Called after Update
void LateUpdate() {
DrawRope();
}
/// <summary>
/// Call whenever we want to start a grapple
/// </summary>
void StartGrapple() {
RaycastHit hit;
if (Physics.Raycast(camera.position, camera.forward, out hit, maxDistance, whatIsGrappleable)) {
grapplePoint = hit.point;
joint = player.gameObject.AddComponent<SpringJoint>();
joint.autoConfigureConnectedAnchor = false;
joint.connectedAnchor = grapplePoint;
joint.connectedBody = rb;
float distanceFromPoint = Vector3.Distance(player.position, grapplePoint);
//The distance grapple will try to keep from grapple point.
joint.maxDistance = distanceFromPoint * 0.5f;
joint.minDistance = distanceFromPoint * 0.25f;
//Adjust these values to fit your game.
joint.spring = 4.5f;
joint.damper = 7f;
joint.massScale = 4.5f;
lr.positionCount = 2;
currentGrapplePosition = gunTip.position;
}
}
/// <summary>
/// Call whenever we want to stop a grapple
/// </summary>
void StopGrapple() {
lr.positionCount = 0;
Destroy(joint);
}
private Vector3 currentGrapplePosition;
void DrawRope() {
//If not grappling, don't draw rope
if (!joint) return;
currentGrapplePosition = Vector3.Lerp(currentGrapplePosition, grapplePoint, Time.deltaTime * 8f);
lr.SetPosition(0, gunTip.position);
lr.SetPosition(1, currentGrapplePosition);
}
public bool IsGrappling() {
return joint != null;
}
public Vector3 GetGrapplePoint() {
return grapplePoint;
}
}
Comment
Your answer
Follow this Question
Related Questions
Realistic Material Behavior (RubberBand & Metal) 0 Answers
Gravity on a cube planet 1 Answer
How do I change gravity of a player from a press of a button? 0 Answers
Allowing player to glide/fall slowly 2 Answers
How to get segments of a vine to face each other as they move up and down a 3D tree? 0 Answers