improved/new invisibility shader, added auto targetting to magic attacks usage
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user