|
|
@@ -14,6 +14,14 @@ public class WaterSprite : Boss
|
|
|
Rush, //水面冲刺
|
|
|
}
|
|
|
|
|
|
+ public enum JumpMoveState
|
|
|
+ {
|
|
|
+ none,
|
|
|
+ rise,
|
|
|
+ fall,
|
|
|
+ back,
|
|
|
+ }
|
|
|
+
|
|
|
[System.Serializable]
|
|
|
public struct AttackAssignment
|
|
|
{
|
|
|
@@ -35,14 +43,40 @@ public class WaterSprite : Boss
|
|
|
private AttackMethods curAttackType;
|
|
|
private WaterSpriteAttackController attack;
|
|
|
|
|
|
+ [Header("boss初始y轴")]
|
|
|
+ public float minIdleY;
|
|
|
+ public float maxIdleY;
|
|
|
+ private float idleY;
|
|
|
+
|
|
|
[LabelText("站在水面时的y轴")]
|
|
|
public float OnWaterPosY;
|
|
|
|
|
|
[Header("移动")]
|
|
|
+ private bool hasFirst;
|
|
|
+ [LabelText("最终目标(玩家坐标)")]
|
|
|
public Vector3 aimPos;
|
|
|
- public float minHeight, maxHeight;
|
|
|
+ //跳跃初速度
|
|
|
+ public float minUpSpeed, maxUpSpeed;
|
|
|
+ private float upSpeed;
|
|
|
+ private Vector3 curVel;
|
|
|
+ //下落重力
|
|
|
+ private float gravity;
|
|
|
+ //移动距离什么的
|
|
|
public float minLength, maxLength;
|
|
|
- private float nowAimX; //现在要落在水面的x轴
|
|
|
+ private float horiDis;
|
|
|
+ //现在要落在水面的坐标
|
|
|
+ private Vector3 nowAim;
|
|
|
+ private Vector3 dir;
|
|
|
+ //单次跳跃动作的时长
|
|
|
+ [LabelText("仅rise动作/fall动作")]
|
|
|
+ public float singleJumpTime;
|
|
|
+ private JumpMoveState jumpState;
|
|
|
+ [HideInInspector]
|
|
|
+ public bool isHitWater;
|
|
|
+ private float jumpTime;
|
|
|
+ //跳跃次数
|
|
|
+ private int jumpCount;
|
|
|
+ public int minJumpCount, maxJumpCount;
|
|
|
|
|
|
public override void Init()
|
|
|
{
|
|
|
@@ -51,9 +85,9 @@ public class WaterSprite : Boss
|
|
|
}
|
|
|
|
|
|
//下一步移动位置
|
|
|
- private float GetAimPos()
|
|
|
+ private Vector3 GetAimPos()
|
|
|
{
|
|
|
- float aimX = aimPos.x;
|
|
|
+ Vector3 aim = aimPos;
|
|
|
float dis = transform.position.x - aimPos.x;
|
|
|
int fx = 1;
|
|
|
if (dis > 0)
|
|
|
@@ -67,12 +101,12 @@ public class WaterSprite : Boss
|
|
|
//和目标位置的距离 小于 最低移动距离时,移动到目标位置
|
|
|
if (dis < minLength)
|
|
|
{
|
|
|
- aimX = aimPos.x;
|
|
|
+ aim.x = aimPos.x;
|
|
|
}
|
|
|
//和目标位置的距离 小于 最低移动距离的两倍时,移动最低移动距离
|
|
|
else if (dis < minLength * 2)
|
|
|
{
|
|
|
- aimX = transform.position.x + minLength * fx;
|
|
|
+ aim.x = transform.position.x + minLength * fx;
|
|
|
}
|
|
|
//在移动距离阈值内随机
|
|
|
else
|
|
|
@@ -83,58 +117,157 @@ public class WaterSprite : Boss
|
|
|
{
|
|
|
maxX = dis - minLength;
|
|
|
}
|
|
|
- aimX = transform.position.x + Random.Range(minLength, maxX) * fx;
|
|
|
+ float k = Random.Range(minLength, maxX) * fx;
|
|
|
+ aim.x = transform.position.x + k;
|
|
|
}
|
|
|
- return aimX;
|
|
|
+ aim.y = OnWaterPosY;
|
|
|
+ return aim;
|
|
|
}
|
|
|
|
|
|
//步步生花
|
|
|
- private void SingleMove(Vector3 aimPos)
|
|
|
+ public override void ToMove()
|
|
|
{
|
|
|
-
|
|
|
+ ToJumpMove(JumpMoveState.rise);
|
|
|
}
|
|
|
|
|
|
- public override void ToMove()
|
|
|
+ public override void OnMove()
|
|
|
{
|
|
|
- ani.Play("move");
|
|
|
-
|
|
|
+ OnJumpMove();
|
|
|
}
|
|
|
|
|
|
- public override void OnMove()
|
|
|
+ //升到最高点→播动画,降到最低点→面试成功
|
|
|
+ private void ToJumpMove(JumpMoveState jms)
|
|
|
+ {
|
|
|
+ if (jms == jumpState)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ jumpState = jms;
|
|
|
+ switch (jumpState)
|
|
|
+ {
|
|
|
+ case JumpMoveState.rise:
|
|
|
+ //计算落点
|
|
|
+ jumpTime = 0;
|
|
|
+ aimPos = pc.bodyTrans.position;
|
|
|
+ nowAim = GetAimPos();
|
|
|
+ //水平速度
|
|
|
+ horiDis = Mathf.Abs(nowAim.x - transform.position.x);
|
|
|
+ float horVel = horiDis / singleJumpTime;
|
|
|
+ //水平方向
|
|
|
+ dir = Vector3.zero;
|
|
|
+ dir.x = nowAim.x - transform.position.x;
|
|
|
+ dir = dir.normalized;
|
|
|
+ //随机初速度
|
|
|
+ upSpeed = Random.Range(minUpSpeed, maxUpSpeed);
|
|
|
+ gravity = 2f * upSpeed / singleJumpTime; //初始垂直速度,t=2*v0/g => g=2*v0/t
|
|
|
+ curVel = dir * horVel + Vector3.up * upSpeed; //初始速度
|
|
|
+ if (!hasFirst)
|
|
|
+ {
|
|
|
+ hasFirst = true;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ani.Play("move_rise", 0, 0);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case JumpMoveState.fall:
|
|
|
+ ani.Play("move_fall", 0, 0);
|
|
|
+ jumpTime = 0;
|
|
|
+ break;
|
|
|
+ case JumpMoveState.none:
|
|
|
+ EndCurAttackState(true);
|
|
|
+ hasFirst = false;
|
|
|
+ break;
|
|
|
+ case JumpMoveState.back:
|
|
|
+ idleY = Random.Range(minIdleY, maxIdleY);
|
|
|
+ float useTime = (idleY - OnWaterPosY) / upSpeed;
|
|
|
+ ani.speed = singleJumpTime / useTime;
|
|
|
+ ani.Play("move_rise", 0, 0);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void OnJumpMove()
|
|
|
{
|
|
|
- if (Mathf.Abs(transform.position.x - nowAimX) <= 0.2f)
|
|
|
+ switch (jumpState)
|
|
|
{
|
|
|
- ToMove();
|
|
|
+ //向上升到某高度
|
|
|
+ case JumpMoveState.rise:
|
|
|
+ curVel += Vector3.down * gravity * Time.deltaTime;
|
|
|
+ transform.position += curVel * Time.deltaTime;
|
|
|
+ jumpTime += Time.deltaTime;
|
|
|
+ if (jumpTime >= 1 && curVel.y <= 0)
|
|
|
+ {
|
|
|
+ ToJumpMove(JumpMoveState.fall);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case JumpMoveState.fall:
|
|
|
+ curVel += Vector3.down * gravity * Time.deltaTime;
|
|
|
+ transform.position += curVel * Time.deltaTime;
|
|
|
+ if (transform.position.y <= OnWaterPosY + 0.02f)
|
|
|
+ {
|
|
|
+ transform.position = nowAim;
|
|
|
+ jumpCount--;
|
|
|
+ if (jumpCount > 0)
|
|
|
+ {
|
|
|
+ ToJumpMove(JumpMoveState.rise);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ToJumpMove(JumpMoveState.back);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case JumpMoveState.back:
|
|
|
+ transform.position += new Vector3(0, 1, 0) * upSpeed * Time.deltaTime;
|
|
|
+ if (transform.position.y >= idleY - 0.02f)
|
|
|
+ {
|
|
|
+ Vector3 vec = transform.position;
|
|
|
+ vec.y = idleY;
|
|
|
+ transform.position = vec;
|
|
|
+ ani.speed = 1;
|
|
|
+ ToJumpMove(JumpMoveState.none);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public override void RandomAttackType(AttackCategories cate)
|
|
|
{
|
|
|
AttackAssignment[] attacks = attackConfigurations[(int)cate].attacks;
|
|
|
- switch (cate)
|
|
|
+ int[] powers = new int[attacks.Length];
|
|
|
+ for (int i = 0; i < attacks.Length; i++)
|
|
|
+ {
|
|
|
+ powers[i] = attacks[i].weight;
|
|
|
+ }
|
|
|
+ int a = RandomWithWeight(powers);
|
|
|
+ curAttackType = attacks[a].attack;
|
|
|
+ /*switch (cate)
|
|
|
{
|
|
|
case AttackCategories.A:
|
|
|
break;
|
|
|
case AttackCategories.B:
|
|
|
- int[] powers = new int[attacks.Length];
|
|
|
- for(int i = 0; i < attacks.Length; i++)
|
|
|
- {
|
|
|
- powers[i] = attacks[i].weight;
|
|
|
- }
|
|
|
- int a = RandomWithWeight(powers);
|
|
|
- curAttackType = attacks[a].attack;
|
|
|
+
|
|
|
break;
|
|
|
case AttackCategories.C:
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
- }
|
|
|
+ }*/
|
|
|
}
|
|
|
|
|
|
public override void Attack()
|
|
|
{
|
|
|
switch (curAttackType)
|
|
|
{
|
|
|
+ case AttackMethods.Move:
|
|
|
+ jumpCount = Random.Range(minJumpCount, maxJumpCount);
|
|
|
+ ChangeState(CharacterState.Run);
|
|
|
+ break;
|
|
|
case AttackMethods.Umbrella:
|
|
|
ani.Play("shoot");
|
|
|
attack.SkillBlackUmbrella();
|