improved/new invisibility shader, added auto targetting to magic attacks usage

This commit is contained in:
2025-03-24 10:26:18 +01:00
parent 96e5f2b08d
commit d4906fa2b8
7 changed files with 1819 additions and 1439 deletions

View File

@@ -12,6 +12,7 @@ using UnityEngine.Events;
using UnityEngine.VFX;
using static Invector.vObjectDamage;
using DG.Tweening;
using Invector.vCharacterController.AI.FSMBehaviour;
namespace Beyond
{
@@ -61,6 +62,15 @@ namespace Beyond
private ShieldCollisionController shieldCollisionController;
private bool canPlayNoFaithClip = true;
private bool canPlayCantDoClip = true;
[BoxGroup("Auto targetting")]
public float maxTurnTowardDistance = 10f;
[BoxGroup("Auto targetting")]
public float rotationSpeed = 500f;
[BoxGroup("Auto targetting")]
public float degreeThreshold = 100;
public UnityAction<Collider> onHitFireball;
@@ -191,7 +201,8 @@ namespace Beyond
private IEnumerator FlameThrowerhCoroutine()
{
EffectDesc flameThrowe = m_effects[(int)EffectType.FLAME_THROWER];
yield return new WaitForSeconds(flameThrowe.startTime);
//yield return new WaitForSeconds(flameThrowe.startTime);
yield return TurnTowardTargetCoroutine(flameThrowe.startTime);
flameDamager.enabled = true;
flame.Play();
yield return new WaitForSeconds(flameThrowe.endTime);
@@ -246,10 +257,21 @@ namespace Beyond
StartCoroutine(FireballCoroutine());
}
private IEnumerator TurnTowardTargetCoroutine(float maxTime)
{
float time = 0;
while (time < maxTime)
{
time += Time.deltaTime;
LerpRotation();
yield return null;
}
yield return null; }
private IEnumerator FireballCoroutine()
{
EffectDesc fireball = m_effects[(int)EffectType.FIREBALL];
yield return new WaitForSeconds(fireball.startTime);
//yield return new WaitForSeconds(fireball.startTime);
yield return TurnTowardTargetCoroutine(fireball.startTime);
var fireballClone = Instantiate(fireball.effectObject, fireball.effectObject.transform.position, fireball.effectObject.transform.rotation);
fireballClone.SetActive(true);
RFX4_PhysicsMotion fireballMotionController = fireballClone.GetComponentInChildren<RFX4_PhysicsMotion>(); //could maybe add some reference container to use get component without children
@@ -478,6 +500,72 @@ namespace Beyond
selectedEffect = GetCurrentlySelectedPower();
}
private void LerpRotation()
{
float minDist = maxTurnTowardDistance;
var enemy = GetNearestEnemy(ref minDist);
if (!IsEnemyInAngleRange(enemy))
{
return;
}
Transform playerTransform = Player.Instance.transform;
var toEnemy = enemy.transform.position - playerTransform.position;
toEnemy.y = 0f;
toEnemy.Normalize();
Quaternion targetRot =
Quaternion.LookRotation(toEnemy);
var rotation = playerTransform.rotation;
rotation = Quaternion.RotateTowards(rotation, targetRot, Time.deltaTime * rotationSpeed);
//rotation = Quaternion.Lerp(rotation, targetRot, Time.deltaTime * rotationSpeed);
playerTransform.rotation = rotation;
}
private bool IsEnemyInAngleRange(vFSMBehaviourController ai)
{
if (ai == null)
{
return false;
}
Vector3 playerFwd = Player.Instance.transform.forward;
Vector3 target = (ai.transform.forward - playerFwd).normalized;
float dot = Vector3.Dot(playerFwd, target );
float angle = 180f - Mathf.Acos(dot) * Mathf.Rad2Deg;
//Debug.Log("IsEnemyInAngleRange: angle: "+angle);
if (angle > degreeThreshold)
{
return false;
}
return true;
}
private vFSMBehaviourController GetNearestEnemy(ref float minDist)
{
var controllers = GameStateManager.Instance.GetActiveCombatcontrollers();
Vector3 playerPos = Player.Instance.transform.position;
vFSMBehaviourController ctrl = null;
foreach (var aic in controllers)
{
var dist2 = aic.transform.position - Player.Instance.transform.position;
dist2.y = 0f;
if (dist2.magnitude < minDist)
{
ctrl = aic;
minDist = dist2.magnitude;
}
}
return ctrl;
}
protected virtual void AnimationBehaviour()
{ // know if the animation is playing or not