public virtual bool DecideAttack(float?act) { //act will indicates special ability if (!sys.FirstWarnUseOfAttackFb) { Debug.LogWarning("No attack method implemented, use fallback method"); sys.FirstWarnUseOfAttackFb = true; } bool attacking = false; if (act != null) { if (act >= 0) { float minDistance = Mathf.Infinity; GameObject minUnit = sys.EmptyUnit; foreach (GameObject enemy in inspector.getCurrentEnemys()) { if (enemy == this.gameObject) { continue; } if (inspector.setScriptsFrom(enemy) && !inspector.isDead()) { float distanceToTarget = Vector3.Distance(this.transform.localPosition, enemy.transform.localPosition); if (distanceToTarget <= DeprecatedAttackRange) { minUnit = (distanceToTarget < minDistance)?enemy:minUnit; minDistance = (distanceToTarget < minDistance)?distanceToTarget:minDistance; } } } if (minUnit.CompareTag("Enemy") || minUnit.CompareTag("Knight")) { Vector3 currentTargetPosition = minUnit.transform.position; currentTargetPosition.y = transform.position.y; transform.LookAt(currentTargetPosition); if (inspector.setScriptsFrom(minUnit)) { inspector.setLives(inspector.getLives() - (Time.deltaTime * damage)); attacking = true; test += 1; if (inspector.getLives() < 0) { print("Damaged opponent dead"); //inspector.printOnPanel($"{this.gameObject.GetInstanceID()}:Reward 0.5"); //AddReward(0.5f); } } else { Debug.LogError("Invalid unit targetted."); } } } else { } } return(attacking); }
void FixedUpdate() { if (lives != lastLives && Academy.showeffects) { if (!DamagedParticle.isPlaying) { DamagedParticle.Play(); //DamagedParticle.Simulate(Time.unscaledDeltaTime, true, false); } lastLives = lives; } //find closest enemy //ML:relating to moves if (currentTarget != null) { inspector.setScriptsFrom(currentTarget.gameObject); if (!inspector.isScriptValid() || inspector.isDead()) { currentTarget = findCurrentTarget(); } } else { currentTarget = findCurrentTarget(); } //if character ran out of lives, it should die if (lives < 0 && !dead) { die(); } else { if (Vector3.Distance(agent.destination, transform.position) <= agent.stoppingDistance && currentTarget != null) { int sign = rnd.Next(0, 2) * 2 - 1; int sign2 = rnd.Next(0, 2) * 2 - 1; agent.destination = new Vector3(currentTarget.position.x + (float)gausianRand() * RandomRange * sign, currentTarget.position.y, currentTarget.position.z + (float)gausianRand() * RandomRange * sign2); agent.isStopped = false; } else if (currentTarget == null) { agent.destination = getRandomPosition(area); } if (isPassedCooltime) //&& (rnd.Next(0, 2) * 2 - 1)>0) { { foreach (GameObject unit in HitboxComponent.GetCollideObjects()) { if (unit == null && !ReferenceEquals(unit, null)) { HitboxComponent.RemoveObject(unit); continue; } if (unit.CompareTag("Knight")) { if (inspector.setScriptsFrom(unit) && !inspector.isDead()) { inspector.setLives(inspector.getLives() - (damage)); if (inspector.getLives() < 0) { HitboxComponent.RemoveObject(unit); } } else { Debug.LogWarning("Invalid Target Triggered."); } } } isPassedCooltime = false; StartCoroutine("Cooltime"); } } //ML:relating to moves }