Update
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
using UnityEngine;
|
||||
using System.Collections;
|
||||
namespace Invector
|
||||
{
|
||||
public class vPendulum : MonoBehaviour
|
||||
{
|
||||
[Range(0.0f, 360.0f)]
|
||||
public float angle = 90.0f;
|
||||
[Range(0.0f, 4.0f)]
|
||||
public float speed = 1.5f;
|
||||
public float startDelay;
|
||||
Quaternion qStart, qEnd;
|
||||
private float startTime;
|
||||
private bool work;
|
||||
private bool working;
|
||||
IEnumerator Start()
|
||||
{
|
||||
qStart = PendulumRotation(angle);
|
||||
qEnd = PendulumRotation(-angle);
|
||||
yield return new WaitForSeconds(startDelay);
|
||||
work = true;
|
||||
// while (true)
|
||||
// {
|
||||
// yield return new WaitForEndOfFrame();
|
||||
// startTime += Time.deltaTime;
|
||||
// transform.rotation = Quaternion.Lerp (qStart, qEnd,(Mathf.Sin(startTime * speed + Mathf.PI/2) + 1.0f)/ 2.0f);
|
||||
// }
|
||||
}
|
||||
|
||||
void FixedUpdate()
|
||||
{
|
||||
if (work)
|
||||
{
|
||||
|
||||
if (!working)
|
||||
{
|
||||
transform.rotation = Quaternion.RotateTowards(transform.rotation, qEnd, speed);
|
||||
if (Vector3.Distance(transform.rotation.eulerAngles, qEnd.eulerAngles) < 0.1f)
|
||||
{
|
||||
|
||||
working = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
startTime += Time.deltaTime;
|
||||
transform.rotation = Quaternion.Lerp(qStart, qEnd, (Mathf.Sin(startTime * speed + Mathf.PI / 2) + 1.0f) / 2.0f);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void resetTimer()
|
||||
{
|
||||
startTime = 0.0f;
|
||||
}
|
||||
|
||||
Quaternion PendulumRotation(float _angle)
|
||||
{
|
||||
var rot = transform.rotation;
|
||||
var zAngle = rot.eulerAngles.z + _angle;
|
||||
|
||||
if (zAngle > 180) zAngle -= 360;
|
||||
else if (zAngle < -180) zAngle += 360;
|
||||
|
||||
rot.eulerAngles = new Vector3(rot.eulerAngles.x, rot.eulerAngles.y, zAngle);
|
||||
return rot;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 079e861cfb67e5a4dac71c7923eb14c5
|
||||
timeCreated: 1430594205
|
||||
licenseType: Store
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,29 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace Invector
|
||||
{
|
||||
public class vPickupItem : MonoBehaviour
|
||||
{
|
||||
AudioSource _audioSource;
|
||||
public AudioClip _audioClip;
|
||||
public GameObject _particle;
|
||||
|
||||
void Start()
|
||||
{
|
||||
_audioSource = GetComponent<AudioSource>();
|
||||
}
|
||||
|
||||
void OnTriggerEnter(Collider other)
|
||||
{
|
||||
if (other.CompareTag("Player") && !_audioSource.isPlaying)
|
||||
{
|
||||
Renderer[] renderers = GetComponentsInChildren<Renderer>();
|
||||
foreach (Renderer r in renderers)
|
||||
r.enabled = false;
|
||||
|
||||
_audioSource.PlayOneShot(_audioClip);
|
||||
Destroy(gameObject, _audioClip.length);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 543c37bcbcf489b4eb7625c649dbbdf1
|
||||
timeCreated: 1445604874
|
||||
licenseType: Store
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,162 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace Invector
|
||||
{
|
||||
public class vPlatform : vMonoBehaviour
|
||||
{
|
||||
#region Variables
|
||||
|
||||
public vPlatformPoint[] points;
|
||||
[Tooltip("Movement speed between points")]
|
||||
public float defaultSpeed = 1f;
|
||||
[Tooltip("Time to stay in current point")]
|
||||
public float defaultStayTime = 2f;
|
||||
[Tooltip("Index to Starting point")]
|
||||
public int startIndex;
|
||||
|
||||
public bool pause;
|
||||
|
||||
[HideInInspector]
|
||||
public bool canMove;
|
||||
|
||||
Vector3 oldEuler;
|
||||
int index = 0;
|
||||
bool invert;
|
||||
float currentTime;
|
||||
float currentSpeed;
|
||||
float dist, currentDist;
|
||||
Transform targetTransform;
|
||||
|
||||
#endregion
|
||||
|
||||
void OnDrawGizmos()
|
||||
{
|
||||
if (points == null || points.Length == 0 || startIndex >= points.Length) return;
|
||||
Transform oldT = points[0].transform;
|
||||
Gizmos.color = new Color(0, 1, 0, 0.5f);
|
||||
if (!Application.isPlaying)
|
||||
{
|
||||
transform.position = points[startIndex].transform.position;
|
||||
transform.eulerAngles = points[startIndex].transform.eulerAngles;
|
||||
}
|
||||
|
||||
foreach (vPlatformPoint t in points)
|
||||
{
|
||||
if (t.transform != null && t.transform != oldT)
|
||||
{
|
||||
Gizmos.DrawLine(oldT.position, t.transform.position);
|
||||
oldT = t.transform;
|
||||
}
|
||||
}
|
||||
|
||||
foreach (vPlatformPoint t in points)
|
||||
{
|
||||
if (t.transform)
|
||||
{
|
||||
Matrix4x4 rotationMatrix = Matrix4x4.TRS(t.transform.position, t.transform.rotation, transform.lossyScale);
|
||||
Gizmos.matrix = rotationMatrix;
|
||||
Gizmos.DrawCube(Vector3.zero, Vector3.one);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void SetPause(bool value)
|
||||
{
|
||||
pause = value;
|
||||
}
|
||||
|
||||
void Start()
|
||||
{
|
||||
if (points.Length == 0 || startIndex >= points.Length) return;
|
||||
if (points.Length < 2) return;
|
||||
transform.position = points[startIndex].transform.position;
|
||||
transform.eulerAngles = points[startIndex].transform.eulerAngles;
|
||||
oldEuler = transform.eulerAngles;
|
||||
var targetIndex = startIndex;
|
||||
|
||||
if (startIndex + 1 < points.Length) targetIndex++;
|
||||
else if (startIndex - 1 > 0)
|
||||
{
|
||||
targetIndex--; invert = true;
|
||||
}
|
||||
|
||||
dist = Vector3.Distance(transform.position, points[targetIndex].transform.position);
|
||||
targetTransform = points[targetIndex].transform;
|
||||
currentTime = points[startIndex].useDefaultStayTime ? defaultStayTime : points[index].stayTime;
|
||||
currentSpeed = points[startIndex].useDefaultSpeed ? defaultSpeed : points[index].speedToNextPoint;
|
||||
index = targetIndex;
|
||||
canMove = true;
|
||||
}
|
||||
|
||||
void FixedUpdate()
|
||||
{
|
||||
if (points.Length == 0 && !canMove) return;
|
||||
|
||||
if (pause) return;
|
||||
|
||||
currentDist = Vector3.Distance(transform.position, targetTransform.position);
|
||||
|
||||
if (currentTime <= 0)
|
||||
{
|
||||
var distFactor = (float)Mathf.Clamp((100f - ((float)(100f * currentDist) / dist)) * 0.01f, 0, 1f);
|
||||
//distFactor = (float)System.Math.Round(distFactor, 6);
|
||||
|
||||
transform.position = Vector3.MoveTowards(transform.position, targetTransform.position, currentSpeed * Time.deltaTime);
|
||||
if (!float.IsNaN(distFactor) && !float.IsInfinity(distFactor) && oldEuler != (oldEuler + (((targetTransform.eulerAngles) - oldEuler))))
|
||||
{
|
||||
transform.eulerAngles = Vector3.Lerp(oldEuler, targetTransform.eulerAngles, distFactor);
|
||||
}
|
||||
}
|
||||
else
|
||||
currentTime -= Time.fixedDeltaTime;
|
||||
|
||||
if (currentDist < 0.02f)
|
||||
{
|
||||
currentSpeed = points[index].useDefaultSpeed ? defaultSpeed : points[index].speedToNextPoint;
|
||||
currentTime = points[index].useDefaultStayTime ? defaultStayTime : points[index].stayTime;
|
||||
if (!invert)
|
||||
{
|
||||
if (index + 1 < points.Length) index++;
|
||||
else invert = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (index - 1 >= 0) index--;
|
||||
else invert = false;
|
||||
}
|
||||
dist = Vector3.Distance(targetTransform.position, points[index].transform.position);
|
||||
targetTransform = points[index].transform;
|
||||
oldEuler = transform.eulerAngles;
|
||||
}
|
||||
}
|
||||
|
||||
void OnTriggerStay(Collider other)
|
||||
{
|
||||
if (other.transform.parent != transform && other.transform.CompareTag("Player") && other.GetComponent<Invector.vCharacterController.vCharacter>() != null)
|
||||
{
|
||||
other.transform.parent = transform;
|
||||
}
|
||||
}
|
||||
|
||||
void OnTriggerExit(Collider other)
|
||||
{
|
||||
if (other.transform.parent == transform && other.transform.CompareTag("Player"))
|
||||
{
|
||||
other.transform.parent = null;
|
||||
other.transform.eulerAngles = new Vector3(0, other.transform.eulerAngles.y, 0);
|
||||
}
|
||||
}
|
||||
|
||||
[System.Serializable]
|
||||
public class vPlatformPoint
|
||||
{
|
||||
public Transform transform;
|
||||
public bool useDefaultStayTime = true;
|
||||
[vHideInInspector("useDefaultstayTime", true)]
|
||||
public float stayTime;
|
||||
public bool useDefaultSpeed = true;
|
||||
[vHideInInspector("useDefaultSpeed", true)]
|
||||
public float speedToNextPoint = 1f;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1dc77ab1076342a49be3f83c385c67d1
|
||||
timeCreated: 1469556787
|
||||
licenseType: Store
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,44 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace Invector.vCharacterController
|
||||
{
|
||||
public class vPunchingBag : MonoBehaviour
|
||||
{
|
||||
public Rigidbody _rigidbody;
|
||||
public float forceMultipler = 0.5f;
|
||||
public SpringJoint joint;
|
||||
public vHealthController character;
|
||||
public bool removeComponentsAfterDie;
|
||||
|
||||
void Start()
|
||||
{
|
||||
_rigidbody = GetComponent<Rigidbody>();
|
||||
character = GetComponent<vHealthController>();
|
||||
character.onReceiveDamage.AddListener(TakeDamage);
|
||||
}
|
||||
|
||||
public void TakeDamage(vDamage damage)
|
||||
{
|
||||
var point = damage.hitPosition;
|
||||
var relativePoint = transform.position;
|
||||
relativePoint.y = point.y;
|
||||
var forceForward = relativePoint - point;
|
||||
|
||||
if (character != null && joint != null && character.currentHealth < 0)
|
||||
{
|
||||
joint.connectedBody = null;
|
||||
if (removeComponentsAfterDie)
|
||||
{
|
||||
foreach (MonoBehaviour mono in character.gameObject.GetComponentsInChildren<MonoBehaviour>())
|
||||
if (mono != this)
|
||||
Destroy(mono);
|
||||
}
|
||||
}
|
||||
|
||||
if (_rigidbody != null)
|
||||
{
|
||||
_rigidbody.AddForce(forceForward * (damage.damageValue * forceMultipler), ForceMode.Impulse);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ce9a215606679cb40bec79dd1cf72e1d
|
||||
timeCreated: 1462316825
|
||||
licenseType: Store
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,244 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Events;
|
||||
using UnityEngine.Serialization;
|
||||
|
||||
namespace Invector
|
||||
{
|
||||
[RequireComponent(typeof(BoxCollider))]
|
||||
[vClassHeader("Simple Door", openClose = false)]
|
||||
public class vSimpleDoor : vMonoBehaviour
|
||||
{
|
||||
[vReadOnly]
|
||||
public DoorState state;
|
||||
public Transform pivot;
|
||||
[SerializeField] protected bool _startOpened;
|
||||
public virtual bool startOpened { get { return _startOpened; } set { _startOpened = value; } }
|
||||
[SerializeField, FormerlySerializedAs("autoOpen")] protected bool _autoOpen = true;
|
||||
public virtual bool autoOpen { get { return _autoOpen; } set { _autoOpen = value; } }
|
||||
[SerializeField, FormerlySerializedAs("autoClose")] protected bool _autoClose = true;
|
||||
public virtual bool autoClose { get { return _autoClose; } set { _autoClose = value; } }
|
||||
[vHideInInspector("autoClose"), Tooltip("Close the door only if door is completely opened\n**The TimeToClose will be used yet")]
|
||||
public bool closeOnlyWhenOpened;
|
||||
[Tooltip("Target angle of Opened door")]
|
||||
public float angleOfOpen = 90f;
|
||||
[vHideInInspector("autoOpen"), Tooltip("Min angle between character forward and door that can auto open")]
|
||||
public float minAngleToOpen = 45f;
|
||||
[Tooltip("Door can open to left side and to right side, if false, door will open just in to right side")]
|
||||
public bool openBothSide = true;
|
||||
public float closeSpeed = 2f;
|
||||
public float openSpeed = 2f;
|
||||
[vHideInInspector("autoClose"), Tooltip("Time to auto close door after Opened")]
|
||||
public float timeToClose = 1f;
|
||||
[Tooltip("Used when autoOpen or autoClose is checked")]
|
||||
public vTagMask tagsToOpen = new List<string>() { "Player" };
|
||||
|
||||
private Vector3 currentAngle;
|
||||
private float angle;
|
||||
private bool _invertOpenSide;
|
||||
private Collider colliderInTrigger;
|
||||
public UnityEvent onStartOpen, onStartOpenRight, onStartOpenLeft, onStartClose;
|
||||
public UnityEvent onOpen, onOpenRight, onOpenLeft, onClose;
|
||||
|
||||
public enum DoorState
|
||||
{
|
||||
Closed, Opened, Closing, Opening
|
||||
}
|
||||
|
||||
float targetDoorAngle;
|
||||
bool stopDoor;
|
||||
|
||||
protected virtual void Start()
|
||||
{
|
||||
if (!pivot) enabled = false;
|
||||
if (startOpened)
|
||||
{
|
||||
state = DoorState.Closed;
|
||||
Open();
|
||||
}
|
||||
else onClose.Invoke();
|
||||
}
|
||||
|
||||
protected virtual void OnDrawGizmos()
|
||||
{
|
||||
if (pivot)
|
||||
{
|
||||
Gizmos.DrawSphere(transform.position, 0.1f);
|
||||
Gizmos.DrawLine(transform.position, pivot.position);
|
||||
Gizmos.DrawSphere(pivot.position, 0.1f);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Set Door to auto open
|
||||
/// </summary>
|
||||
/// <param name="value"> auto open </param>
|
||||
public virtual void SetAutoOpen(bool value)
|
||||
{
|
||||
autoOpen = value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set Door to auto close
|
||||
/// </summary>
|
||||
/// <param name="value">auto close</param>
|
||||
public virtual void SetAutoClose(bool value)
|
||||
{
|
||||
autoClose = value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Open Door
|
||||
/// </summary>
|
||||
/// <param name="invert">invert direction to open</param>
|
||||
public virtual void Open(bool invert)
|
||||
{
|
||||
_invertOpenSide = invert;
|
||||
Open();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Open Door
|
||||
/// </summary>
|
||||
public virtual void Open()
|
||||
{
|
||||
if (state != DoorState.Opening && state != DoorState.Opening)
|
||||
{
|
||||
targetDoorAngle = invertOpenSide ? -angleOfOpen : angleOfOpen;
|
||||
StartCoroutine(HandleDoor());
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Close Door
|
||||
/// </summary>
|
||||
public virtual void Close()
|
||||
{
|
||||
if (state != DoorState.Closing && state != DoorState.Closed)
|
||||
{
|
||||
targetDoorAngle = 0;
|
||||
StartCoroutine(HandleDoor());
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Open or close door depending othe your current <see cref="state"/>
|
||||
/// </summary>
|
||||
public virtual void ToggleOpenClose()
|
||||
{
|
||||
if (state == DoorState.Closed && state != DoorState.Opening)
|
||||
{
|
||||
Open();
|
||||
}
|
||||
else
|
||||
{
|
||||
Close();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Open or close door Routine
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
protected virtual IEnumerator HandleDoor()
|
||||
{
|
||||
bool open = Mathf.Abs(targetDoorAngle).Equals(angleOfOpen);
|
||||
state = open ? DoorState.Opening : DoorState.Closing;
|
||||
switch (state)///Call start event based in state;
|
||||
{
|
||||
case DoorState.Opening:
|
||||
onStartOpen.Invoke();
|
||||
if (invertOpenSide)
|
||||
onStartOpenLeft.Invoke();
|
||||
else
|
||||
onStartOpenRight.Invoke();
|
||||
break;
|
||||
case DoorState.Closing: onStartClose.Invoke(); break;
|
||||
}
|
||||
|
||||
stopDoor = true; //break last routine to exit (While) function
|
||||
yield return new WaitForEndOfFrame();
|
||||
stopDoor = false; //start new routine
|
||||
while (!stopDoor)
|
||||
{
|
||||
///Lerp current angle to target door angle
|
||||
currentAngle.y = Mathf.MoveTowardsAngle(currentAngle.y, targetDoorAngle, (open ? openSpeed : closeSpeed));
|
||||
if (Mathf.Abs(currentAngle.y - targetDoorAngle) < 0.01f)///Check if target Door angle is reached
|
||||
{
|
||||
currentAngle.y = targetDoorAngle;
|
||||
pivot.localEulerAngles = currentAngle;
|
||||
break;
|
||||
}
|
||||
///Apply the angle to pivot door
|
||||
pivot.localEulerAngles = currentAngle;
|
||||
yield return null;
|
||||
}
|
||||
|
||||
if (!stopDoor)
|
||||
{
|
||||
state = open ? DoorState.Opened : DoorState.Closed;
|
||||
///Close door if auto close and dont has a collider in trigger
|
||||
if (open && autoClose && !colliderInTrigger) CloseWithDelay();
|
||||
|
||||
switch (state)//Call finish event based in state
|
||||
{
|
||||
case DoorState.Opened:
|
||||
onOpen.Invoke();
|
||||
if (invertOpenSide)
|
||||
onOpenLeft.Invoke();
|
||||
else
|
||||
onOpenRight.Invoke();
|
||||
break;
|
||||
case DoorState.Closed: onClose.Invoke(); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void OnTriggerStay(Collider other)
|
||||
{
|
||||
if (tagsToOpen.Contains(other.tag))
|
||||
{
|
||||
if (autoOpen && (state == DoorState.Closing || state == DoorState.Closed))
|
||||
{
|
||||
Vector3 relativePos = transform.InverseTransformPoint(other.transform.position);
|
||||
if (relativePos.z > 0) _invertOpenSide = false;
|
||||
else _invertOpenSide = true;
|
||||
angle = Mathf.Abs(Vector3.Angle(_invertOpenSide ? transform.forward : -transform.forward, other.transform.forward));
|
||||
if (angle < minAngleToOpen)
|
||||
{
|
||||
if (!colliderInTrigger) colliderInTrigger = other;
|
||||
Open();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void OnTriggerExit(Collider other)
|
||||
{
|
||||
if (autoClose && tagsToOpen.Contains(other.tag) &&
|
||||
(colliderInTrigger != null && colliderInTrigger.gameObject.Equals(other.gameObject) || colliderInTrigger == null))
|
||||
{
|
||||
colliderInTrigger = null;
|
||||
if (!closeOnlyWhenOpened || state == DoorState.Opened)
|
||||
{
|
||||
CloseWithDelay();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual bool invertOpenSide
|
||||
{
|
||||
get
|
||||
{
|
||||
return _invertOpenSide && openBothSide;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Close Door using <see cref="timeToClose"/> delay
|
||||
/// </summary>
|
||||
protected virtual void CloseWithDelay()
|
||||
{
|
||||
CancelInvoke("Close");
|
||||
Invoke("Close", timeToClose);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 057d606f3cf29e342b8fe9364e14df75
|
||||
timeCreated: 1450285869
|
||||
licenseType: Store
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user