3D Grappling Hook shape skewing *PLZ HELP*
I am in an entry level game design class and I wanted to do something cool as far as movement mechanic for my game. I followed a rather decent tutorial by Sykoo on youtube (https://www.youtube.com/watch?v=MR1XK-q265E) on how to make a functioning grappling hook inside of unity.
Seemed awesome... Seemed doable...
However once you start banging the hook object around a playfield the shape of the hook obj begins to distort and grow in size.
I have read through a number of tutorials at this point recommending parenting to an empty game object. I have tried parenting the various components to empty game objects, but that hasn't changed anything for me.
I have been thinking about using an Instantiate approach, but I am a little lost with that process...
Any ideas or suggestions on how I can get this working correctly?
I have attached a picture of the object before and after a few "hooks" to illustrate my woes.
Thanks!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GrapplingHook : MonoBehaviour
{
public GameObject hook;
public GameObject hookholder;
public float hookTravelSpeed;
public float playerTravelSpeed;
public static bool fired;
public bool hooked;
public GameObject hookedObj;
public float maxDistance;
private float currentDistance;
private bool grounded;
public void Example(Transform newParent)
{
//Sets "newParent" as the new parent of the player GameObject.
hook.transform.SetParent(newParent);
//Same as above, except this makes the player keep its local orientation rather than its global orientation.
hook.transform.SetParent(newParent, false);
}
void Update()
{
//firing the hook
if (Input.GetMouseButtonDown(0) && fired == false)
fired = true;
if (fired == true && hooked == false)
{
hook.transform.Translate(Vector3.forward * Time.deltaTime * hookTravelSpeed);
currentDistance = Vector3.Distance(transform.position, hook.transform.position);
if (currentDistance >= maxDistance)
ReturnHook();
}
if (hooked == true && fired == true)
{
hook.transform.parent = hookedObj.transform;
transform.position = Vector3.MoveTowards(transform.position, hook.transform.position, Time.deltaTime * playerTravelSpeed);
float distanceToHook = Vector3.Distance(transform.position, hook.transform.position);
this.GetComponent<Rigidbody>().useGravity = false;
if (distanceToHook < 1)
{
if (grounded == false)
{
this.transform.Translate(Vector3.forward * Time.deltaTime * 40f);
this.transform.Translate(Vector3.up * Time.deltaTime * 80f);
}
StartCoroutine("Climb");
}
}
else
{
hook.transform.parent = hookholder.transform;
this.GetComponent<Rigidbody>().useGravity = true;
}
}
IEnumerator Climb()
{
yield return new WaitForSeconds(0.1f);
ReturnHook();
}
void ReturnHook()
{
hook.transform.rotation = hookholder.transform.rotation;
hook.transform.position = hookholder.transform.position;
fired = false;
hooked = false;
}
void CheckIfGround()
{
RaycastHit hit;
float distance = 1f;
Vector3 dir = new Vector3(0, -1);
if (Physics.Raycast(transform.position, dir, out hit, distance))
{
grounded = true;
}
else
{
grounded = false;
}
}
}
[1]: /storage/temp/124728-skewexample.png
Your answer
Follow this Question
Related Questions
Particle Collision causes Explosion?,Explosion on particle contact? 0 Answers
Make a Particle System play when Player gets destroyed 0 Answers
[SOLVED] Stop counting score code error! 1 Answer
Grappling hook script not working, HELP! 0 Answers
How to get the child collider of your own player when there is a collision between two players. 0 Answers