grapplingHook.cs
Script permettant au FPController d'utiliser un grappin.
Copier
// Vidéo tutoriel / mise en place : https://youtu.be/dJmnN0yvfu0
// Il est nécessaire d'effectuer des modifications au script FirstPersonController.cs
// vous pouvez télécharger le script modifié ici : https://pastebin.com/qWV6NUmY
using UnityEngine;
using System.Collections;
// Pour utiliser le FirstPersonController
using UnityStandardAssets.Characters.FirstPerson;
public class grapplingHook : MonoBehaviour{
public Camera cam;
public RaycastHit hit;
public LayerMask surfaces;
public int maxDistance;
public bool isMoving;
public Vector3 location;
public float speed = 10;
public Transform hook;
public FirstPersonController FPC;
public LineRenderer LR;
void Update(){
// Envois du grappin
if(Input.GetKey(KeyCode.Q)){
Grapple();
}
// Si le personnage vole, on l'envoie vers le point d'arrivée
if(isMoving)
{
MoveToSpot();
}
// Annulation / décrochage du grappin
if(Input.GetKey(KeyCode.Space) && isMoving)
{
isMoving = false;
FPC.CanMove = true;
LR.enabled = false;
gameObject.GetComponent< Rigidbody>().useGravity = true;
FPC.m_GravityMultiplier = 2;
}
}
// Lors de l'envois du grappin
public void Grapple(){
// On créé un raycast de "maxDistance" unités depuis la caméra vers l'avant.
// Si ce raycast touche quelque chose c'est que la grappin est utilisable
if(Physics.Raycast(cam.transform.position, cam.transform.forward, out hit, maxDistance, surfaces)){
isMoving = true;
location = hit.point;
FPC.CanMove = false;
gameObject.GetComponent< Rigidbody>().useGravity = false;
FPC.m_GravityMultiplier = 1;
LR.enabled = true;
LR.SetPosition(1, location);
}
}
// Déplacement du joueur vers le point touché par le grappin
public void MoveToSpot(){
transform.position = Vector3.Lerp(transform.position, location, speed * Time.deltaTime / Vector3.Distance(transform.position, location));
LR.SetPosition(0, hook.position);
// Si on est à - de 1 unité(s) de la cible final on décroche le grappin automatiquement
if(Vector3.Distance(transform.position, location) < 1f){
isMoving = false;
FPC.CanMove = true;
LR.enabled = false;
gameObject.GetComponent< Rigidbody>().useGravity = true;
FPC.m_GravityMultiplier = 2;
}
}
}