|
|
- using System.Collections;
- using System.Collections.Generic;
- using System.Linq;
- using UnityEngine;
- using Networking.Server;
-
- public class HomingMissile : Projectile
- {
- [SerializeField]
- ClientList Clients;
-
-
-
- public override IEnumerator ProjectileLogic(Character player, float animationTime, Vector3 direction)
- {
-
- Character target = findPlayer(player);
-
- yield return StartCoroutine(LerpTo(transform.position + Vector3.up * 2, 0.5f));
- yield return new WaitForSeconds(0.5f);
-
- if (target != null)
- {
- yield return StartCoroutine(LerpTo(target.transform.position, 1f));
- yield return PushPlayer(target);
- }
- }
-
- private IEnumerator PushPlayer(Character player)
- {
- Direction[] possibleDirections = DirectionExtras.RandomOrder();
-
- for (int i = 0; i < 4; i++)
- {
- if (Block.isBlockAtPosition( player.transform.position + possibleDirections[i].ToVector() + Vector3.up, 1, ~0))
- continue;
-
- yield return StartCoroutine(player.CurrentBlock.DoPush(player, possibleDirections[i].ToVector()));
- break;
- }
-
- }
-
- private Character findPlayer(Character thisCharacter)
- {
- Character retVal = null;
-
- foreach (ClientData client in Clients)
- {
- if (client.Lives == 0 || client.playerCharacter.stuck || client.playerCharacter == thisCharacter)
- continue;
-
- if (retVal == null)
- retVal = client.playerCharacter;
-
- if (retVal.transform.position.x <= client.playerCharacter.transform.position.x)
- retVal = client.playerCharacter;
- }
-
- return retVal;
- }
-
- private IEnumerator LerpTo(Vector3 endPosition,float animationTime)
- {
- Vector3 startPosition = transform.position;
- float elapsedTime = 0;
-
- while (elapsedTime < animationTime)
- {
-
- transform.position = Vector3.Lerp(startPosition, endPosition, elapsedTime / animationTime);
- transform.LookAt(endPosition, Vector3.up);
- yield return new WaitForEndOfFrame();
- elapsedTime += Time.deltaTime;
-
-
- }
-
- transform.position = endPosition;
-
- }
- }
|