ofb/Assets/Scripts/Tutorial_GrapplingGun.cs

129 lines
4.0 KiB
C#
Raw Permalink Normal View History

2023-04-11 19:55:24 -07:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class Tutorial_GrapplingGun : MonoBehaviour {
[Header("Scripts References:")]
public Tutorial_GrapplingRope grappleRope;
[Header("Transform References:")]
public Transform gunHolder;
public Transform gunPivot;
public Transform firePoint;
[Header("Physics References:")]
public SpringJoint2D m_springJoint2D;
public DistanceJoint2D m_distanceJoint2D;
public Rigidbody2D m_rigidBody2D;
[Header("Rotation:")]
[SerializeField] private bool rotateOverTime = true;
[Range(0, 60)][SerializeField] private float rotationSpeed = 4;
private enum LaunchType {
TransformLaunch,
PhysicsLaunch
}
[Header("No Launch To Point")]
[SerializeField] private float targetDistance = 3;
[SerializeField] private float targetFrequency = 1;
[HideInInspector] public Vector2 grapplePoint;
[HideInInspector] public Vector2 grappleDistanceVector;
[HideInInspector] public bool inDistanceRange = false;
void Start() {
grappleRope.enabled = false;
m_springJoint2D.enabled = false;
m_distanceJoint2D.distance = targetDistance + .5f;
m_distanceJoint2D.enabled = false;
inDistanceRange = false;
}
void Update() {
2023-04-17 16:47:12 -07:00
2023-04-11 19:55:24 -07:00
if (grappleRope.isGrappling && !inDistanceRange && Vector2.Distance(grapplePoint, new Vector2(m_rigidBody2D.transform.position.x, m_rigidBody2D.transform.position.y)) < targetDistance) {
inDistanceRange = true;
}
if (grappleRope.isGrappling) {
RotateGun(grapplePoint, true);
}
2023-04-11 19:55:24 -07:00
if (inDistanceRange) {
m_distanceJoint2D.enabled = true;
}
}
void RotateGun(Vector3 lookPoint, bool allowRotationOverTime) {
Vector3 distanceVector = lookPoint - gunPivot.position;
float angle = Mathf.Atan2(distanceVector.y, distanceVector.x) * Mathf.Rad2Deg;
if (rotateOverTime && allowRotationOverTime) {
gunPivot.rotation = Quaternion.Lerp(gunPivot.rotation, Quaternion.AngleAxis(angle, Vector3.forward), Time.deltaTime * rotationSpeed);
} else {
gunPivot.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
}
}
public void Grapple() {
grappleDistanceVector = grapplePoint - (Vector2)gunPivot.position;
2023-04-11 19:55:24 -07:00
m_springJoint2D.autoConfigureDistance = false;
m_distanceJoint2D.autoConfigureDistance = false;
2023-04-17 16:47:12 -07:00
m_springJoint2D.connectedAnchor = grapplePoint;
m_springJoint2D.enabled = true;
m_distanceJoint2D.connectedAnchor = grapplePoint;
2023-04-11 19:55:24 -07:00
}
public void GrappleToTambourine(GameObject tambourine) {
grappleDistanceVector = grapplePoint - (Vector2)gunPivot.position;
2023-04-11 19:55:24 -07:00
grappleRope.enabled = true;
grapplePoint = tambourine.transform.position;
m_springJoint2D.autoConfigureDistance = false;
m_distanceJoint2D.autoConfigureDistance = false;
m_springJoint2D.frequency = targetFrequency;
m_springJoint2D.connectedAnchor = grapplePoint;
m_springJoint2D.enabled = true;
m_distanceJoint2D.connectedAnchor = grapplePoint;
}
public void GrappleToSurface(Vector2 surfacePoint) {
grappleDistanceVector = grapplePoint - (Vector2)gunPivot.position;
2023-04-11 19:55:24 -07:00
grappleRope.enabled = true;
grapplePoint = surfacePoint;
m_springJoint2D.autoConfigureDistance = false;
m_distanceJoint2D.autoConfigureDistance = false;
m_springJoint2D.frequency = targetFrequency;
m_springJoint2D.connectedAnchor = grapplePoint;
m_springJoint2D.enabled = true;
m_distanceJoint2D.connectedAnchor = grapplePoint;
}
public void ReleaseGrapple() {
grappleRope.enabled = false;
m_springJoint2D.enabled = false;
m_distanceJoint2D.enabled = false;
inDistanceRange = false;
m_rigidBody2D.gravityScale = 1;
gunPivot.rotation = Quaternion.AngleAxis(90, Vector3.forward);
2023-04-11 19:55:24 -07:00
}
}