public HitAbleInfo GetNearestPlayers(Vector3 globalPosition, bool useColliderBounds, float range = -1) { if (GameManager.Instance.PlayerCount == 0) { return(null); } HitAbleInfo nearest = null; float nearestDistance = -1; for (int i = 0; i < GameManager.Instance.GetPlayers().Length; i++) { if (GameManager.Instance.GetPlayers()[i] == null) { continue; } HitAble hitAble = GameManager.Instance.GetPlayers()[i]; float distance = DistanceBetween(globalPosition, hitAble, useColliderBounds); if ((range > 0 && distance < range) && (nearestDistance == -1 || distance < nearestDistance)) { if (nearest == null) { nearest = new HitAbleInfo(); } nearest.hitAble = hitAble; nearest.distance = distance; nearestDistance = distance; } } return(nearest); }
public HitAbleInfo GetNearestHitAbles(Vector3 globalPosition, HitAbleType mask, bool useColliderBounds, float maxDistance = -1) { if (SpawnedHitAbles.Count == 0) { return(null); } HitAbleInfo nearest = new HitAbleInfo() { hitAble = null }; float nearestDistance = -1; for (int i = 0; i < SpawnedHitAbles.Count; i++) { if (!SpawnedHitAbles[i].Transform) { continue; } if (!HitAble.CheckForBitInMask(SpawnedHitAbles[i].hitAble.hitAbleType, mask)) { continue; } float distance = DistanceBetween(globalPosition, SpawnedHitAbles[i].hitAble, useColliderBounds); if ((maxDistance > 0 && distance < maxDistance) && (nearestDistance == -1 || distance < nearestDistance)) { nearest = SpawnedHitAbles[i]; nearest.distance = distance; nearestDistance = distance; } } return(nearest); }
public static void TriggerFoundTarget(Transform sender, HitAbleInfo target) { if (FoundTarget != null) { FoundTarget(sender, target); } }
void TryAttack() { attackTimer -= Time.deltaTime; if (target == null) { targetLocked = false; } if (targetLocked) { if (Vector3.Distance(target.Transform.position, transform.position) > attackDistance) { targetLocked = false; } else { lockTimer -= Time.deltaTime; if (lockTimer <= 0) { target.hitAble.Damage( new Damage() { amount = MyDamage + GameManager.Instance.CurrentDifficulty * DamagePerDifficulty, type = DamageType.MEELE, other = transform }); //Effekt targetLocked = false; } } attackTimer = attackTime; } else { if (attackTimer <= 0) { HitAbleInfo nearestHitAble = EntitySpawnManager.Instance.GetNearestHitAbles(transform.position, AttackHitAbleMask, true, attackDistance); if (nearestHitAble.Transform) { lockTimer = lockTime; targetLocked = true; if (anim) { anim.SetTrigger("Attack"); } target = nearestHitAble; } } } }
void SearchForNewTarget() { if (target == null) { HitAbleInfo[] playersInRange = EntitySpawnManager.Instance.GetPlayersInCircles(transform.position, findTargetDistance, true, true); for (int i = 0; i < playersInRange.Length; i++) { if (playersInRange[i].hitAble.ColliderIsOneOfYours(Physics2D.Raycast(transform.position, playersInRange[i].hitAble.ColliderCenter - transform.position, findTargetDistance, RaycastTargetMask).collider)) { target = playersInRange[i]; GameEventHandler.TriggerFoundTarget(transform, target); } } } }
public void Explode() { HitAbleInfo[] HitAblesInRange = EntitySpawnManager.Instance.GetHitAbleInCircles(transform.position, HitAbleHitMask, ExplosionRange, true); //HitAbleInfo[] collider = EntitySpawnManager.Instance.GetHitAbleInCircles(transform.position, HitAbleHitMask, distance, true, false); for (int i = 0; i < HitAblesInRange.Length; i++) { HitAbleInfo item = HitAblesInRange[i]; if (item == null || item.hitAble == null) { continue; } float distance = 0f; distance = item.distance; float damageMult = (ExplosionRange - distance); item.hitAble.Damage(new Damage() { type = DamageType.EXPLOSION, amount = damageMult * damage, DamageFromAPlayer = true, player = player, other = player.transform }); item.hitAble.Hit(item.ColliderCenter, (item.ColliderCenter - transform.position), force); /* * Debug.Log("Distance: " + HitAblesInRange[i].distance); * HitAblesInRange[i].hitAble.Damage(new Damage() * { * DamageFromAPlayer = true, * player = player, * amount = Mathf.Min(distance - HitAblesInRange[i].distance, 0.0f), * type = DamageType.EXPLOSION, * other = player.transform * }); * HitAblesInRange[i].hitAble.Hit(HitAblesInRange[i].ColliderCenter, (HitAblesInRange[i].ColliderCenter - transform.position), force); * */ } AudioEffectController.Instance.PlayOneShot(explosion, transform.position); EntitySpawnManager.Spawn(hitEffektPoolName, transform.position, Quaternion.identity, forceDirectSpawn: true, countEntity: false); EntitySpawnManager.Despawn(poolName, gameObject, false); }
public void OnFoundTarget(Transform sender, HitAbleInfo newTarget) { if (target == null && newTarget != null && transform) { if (Vector3.Distance(sender.position, transform.position) > findTargetDistance) { target = newTarget; } else { target = new HitAbleInfo() { Transform = sender }; //Follow the sender, maybe we will find one then } } }
// Update is called once per frame void Update() { if (GameManager.GamePaused) { return; } randomJumpTimer -= Time.deltaTime; findTargetTimer += Time.deltaTime; if (findTargetTimer > findTargetTime) { SearchForNewTarget(); findTargetTimer = 0; } float currentMaxSpeed = CurrentMaxSpeed; float currentSpeedChance = speedChange + SpeedChangePerDifficulty * GameManager.Instance.CurrentDifficulty; if (GotHit) { currentMaxSpeed *= 1.5f; currentSpeedChance *= 1.5f; } if (target != null) { if (target.Transform == null) { target = null; } else { targetPos = target.Transform.position; if (Vector3.Distance(target.Transform.position, transform.position) > findTargetDistance) { target = null; } } } else { if (Vector3.Distance(targetPos, transform.position) < distanceToTarget) { DumpPositionFinder(); } } currentSpeed = Mathf.Lerp(currentSpeed, direction * currentMaxSpeed, currentSpeedChance * Time.deltaTime); TargetWalk(); TryAttack(); if (anim) { anim.SetFloat("Forward", Mathf.Abs(direction)); } if (direction == 1 && transform.localScale.x == -1) { transform.localScale = new Vector3(1, transform.localScale.y, transform.localScale.z); } else if (direction == -1 && transform.localScale.x == 1) { transform.localScale = new Vector3(-1, transform.localScale.y, transform.localScale.z); } }