75 lines
2.1 KiB
C#
75 lines
2.1 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public class ArcProjectile : TargetedProjectile
|
|
{
|
|
[Header("Arc Projectile")]
|
|
[SerializeField, Range(0, 90)]
|
|
private float _angle = 45.0f;
|
|
|
|
protected override void ApplyMovement()
|
|
{
|
|
if (Target != null && IsTracking)
|
|
{
|
|
EndPos = Target.Position;
|
|
}
|
|
|
|
// position:
|
|
// k(ax^2 + x)
|
|
// k: angle comme ratio opposé / adjacent
|
|
// a: -1 / distance
|
|
// x: position x sur l'arc
|
|
// y: position y sur l'arc
|
|
float distance = (EndPos.x - StartPos.x);
|
|
float k = Mathf.Sign(distance) * Mathf.Tan(_angle * Mathf.Deg2Rad);
|
|
float a = -1.0f / distance;
|
|
float x = (transform.position.x - StartPos.x) + Speed * Time.deltaTime;
|
|
float y = k * (a * x * x + x);
|
|
Vector2 newPos = new Vector2(StartPos.x + x, StartPos.y + y);
|
|
transform.position = newPos;
|
|
|
|
// rotation:
|
|
// k(2ax + 1)
|
|
// (c'est la dérivée de la position)
|
|
float dDx = k * (2 * a * x + 1);
|
|
float rotationAngle = Mathf.Atan(dDx) * Mathf.Rad2Deg;
|
|
transform.eulerAngles = new Vector3(0, 0, rotationAngle);
|
|
|
|
if (y < 0)
|
|
{
|
|
Destroy(gameObject);
|
|
}
|
|
}
|
|
|
|
protected override void HandleCollision(Collider2D other)
|
|
{
|
|
if (Target == null) return;
|
|
if (other.gameObject != Target.gameObject) return;
|
|
|
|
if (other.TryGetComponent(out Entity target))
|
|
{
|
|
if ((target is HardHeadOpponent))
|
|
{
|
|
IsTracking = false;
|
|
StartPos = transform.position;
|
|
EndPos = Target.Position - new Vector3(1.0f, 0.0f, 0.0f);
|
|
Speed /= -5.0f;
|
|
_angle = Random.Range(30.0f, 80.0f);
|
|
}
|
|
else
|
|
{
|
|
ApplyEffects(target);
|
|
target.Hit(Damage);
|
|
if (target.Hp <= 0)
|
|
{
|
|
target.Death();
|
|
}
|
|
Destroy(gameObject);
|
|
}
|
|
}
|
|
}
|
|
|
|
public float Angle { get => _angle; set => _angle = value; }
|
|
}
|