- Home /
3D Grappling Hook Detect Line of Sight Broken
As the title dictates, I'm trying to create a grappling hook using a line renderer. My goal is to have the line bend as in real life, where ropes bend when they collide with something. My code logic thus far has been quite good; however, my only problem is with collision detection. I'll share my code.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LOStest : MonoBehaviour {
[SerializeField]
private List<Vector3> allPoints = new List<Vector3>();
private bool deployed;
private LineRenderer lr;
private float distanceToGrapple;
private Vector3 grapplePoint = new Vector3(0, 0, 0);
private string gO;
void Start () {
//Declare line renderer
lr = GetComponent<LineRenderer>();
}
void FixedUpdate () {
//Always set first point of line renderer to transform.position
lr.SetPosition(0, transform.position);
RaycastHit grapple;
RaycastHit notGrapple;
if (Input.GetKeyDown(KeyCode.Space)) {
//Available grappling point detected
if (Physics.Raycast(transform.position, transform.forward, out grapple)) {
gO = grapple.collider.name;
//Add the target grappling point
allPoints.Add(grapple.point);
//Set the number of points equal to the grappling points in the array, plus one
lr.numPositions = allPoints.Count + 1;
grapplePoint = allPoints[allPoints.Count - 1];
deployed = !deployed;
} else {
//Release grapple no matter what
deployed = false;
}
}
//Grapple toggled off
if (!deployed) {
allPoints.Clear();
lr.numPositions = 1;
}
if (deployed) {
Vector3 vectorToGrapple = grapplePoint - transform.position;
distanceToGrapple = vectorToGrapple.magnitude;
if (lr.numPositions == allPoints.Count + 1) {
/*Set a line renderer point to the final entry in the array. The allPoints size (unobstructed) is one, which in the line renderer is the second grappling
* point (the first of the line renderer is the transform.position) */
lr.SetPosition(allPoints.Count, allPoints[0]);
}
//Something interrupted the line of sight between player and grapple object
if (Physics.Raycast(transform.position, vectorToGrapple, out notGrapple, distanceToGrapple)) {
//Ignore the collider of the target grapple object
if (gO != notGrapple.collider.name) {
}
}
}
}
}
My problem lies within the end part of my FixedUpdate () method. My goal is to add another point to my allPoints[] array when the line of sight is broken. If I try to add a point to the array and add it to the line renderer position, it infinitely adds the same point.
The problem lies with the code logic. Nothing is too far out of reach to understand for me, it's just that I'm having a hard time putting two and two together.
I've scoured the internet for solutions and help to no avail. If you can offer anything, please do!