This commit is contained in:
2026-05-30 09:16:35 +07:00
parent 2f87ce19a7
commit 1c0ee6efb7
4001 changed files with 3363438 additions and 1738 deletions

View File

@@ -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;
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 079e861cfb67e5a4dac71c7923eb14c5
timeCreated: 1430594205
licenseType: Store
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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);
}
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 543c37bcbcf489b4eb7625c649dbbdf1
timeCreated: 1445604874
licenseType: Store
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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;
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 1dc77ab1076342a49be3f83c385c67d1
timeCreated: 1469556787
licenseType: Store
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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);
}
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: ce9a215606679cb40bec79dd1cf72e1d
timeCreated: 1462316825
licenseType: Store
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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);
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 057d606f3cf29e342b8fe9364e14df75
timeCreated: 1450285869
licenseType: Store
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: