c1_unity/Assets/Scripts/Component/Battle/BattleControlHero.cs
2023-04-03 11:04:31 +08:00

345 lines
12 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace BF
{
public class BattleControlHero : BattleControlUnit
{
private Camera mainCamera;
private Rigidbody unitRigidbody;
private bool isMoving = false;
private float TargetX = 0.0f;
private float TargetZ = 0.0f;
private float moveSpeed = 1.0f;
private Vector3 targetPosition = Vector3.zero;
// 摄像机相关
public bool IsCameraFollowWithHero = true;
private Vector3 cameraOriginPosition = Vector3.zero;
void Awake()
{
mainCamera = Camera.main;
InitRigidbody();
}
private void InitRigidbody()
{
if (!gameObject.TryGetComponent<Rigidbody>(out unitRigidbody))
{
unitRigidbody = gameObject.AddComponent<Rigidbody>();
}
unitRigidbody.angularDrag = 0;
unitRigidbody.useGravity = false;
unitRigidbody.isKinematic = true;
unitRigidbody.constraints = BattleConst.RIGIDBODY_CONSTRAINTS;
bodyCollider = gameObject.AddComponent<SphereCollider>();
bodyCollider.isTrigger = true;
}
public void InitHero(int side, CharacterSpineHelper helper)
{
Side = side;
BattleMgr = BF.BFMain.Instance.BattleMgr;
Direction = 1;
gameObject.layer = BattleConst.LAYER_HERO;
ReuseFlag++;
IsDead = false;
IsInGroundState = false;
IsDisappear = false;
BattleMgr.AddToAtkUnitsList(this);
}
public override void InitHpBar()
{
if (isHaveHpBar)
{
return;
}
hpBar = BattleMgr.PoolHelper.GetHpBar(Side);
hpBar.transform.localScale = Vector3.one;
hpBar.RefreshHpBar(1.0f);
hpBar.SetShieldVisible(false);
BattleMgr.UpdateUIPosition(transform.position, HpBarAddY, hpBar.transform as RectTransform);
isHaveHpBar = true;
}
public override void RefreshHpBar(float percent)
{
if (!isHaveHpBar)
{
return;
}
hpBar.RefreshHpBar(percent);
}
public override void RefreshShieldBar(float percent, bool visible)
{
if (!isHaveHpBar)
{
return;
}
if (visible)
{
hpBar.RefreshShieldBar(percent);
}
hpBar.SetShieldVisible(visible);
}
public void SetCameraStartPosition(Vector3 originPosition)
{
cameraOriginPosition = originPosition;
}
public bool MoveAndAttack(int direction)
{
isMoving = true;
bool isAttack = true;
var x = transform.position.x;
var z = transform.position.z;
if (direction == 1) // 朝向右边
{
BattleControlUnit leftTarget = null;
BattleControlUnit rightTarget = null;
BattleMgr.GetNearestDefUnit(x, z, out leftTarget, out rightTarget);
if (ReferenceEquals(rightTarget, null)) // 右边没有敌人
{
if (ReferenceEquals(leftTarget, null)) // 左边也没有敌人则向该方向进行常规攻击,同时推进
{
if (BattleMgr.GetEffectWarningCount() <= 0)
{
TargetX = x + BattleConfigure.DistanceAttack;
TargetZ = z;
Direction = direction;
}
else // 找不到人,但是有预警的话就往该方向后撤
{
TargetX = x + BattleConfigure.DistanceBack;
TargetZ = z;
isAttack = false;
}
}
else // 左边有敌人,则向该方向进行后撤,并且当前朝向不变
{
TargetX = x + BattleConfigure.DistanceBack;
TargetZ = z;
isAttack = false;
}
}
else // 右边有敌人,向目标进行冲锋推进攻击
{
TargetX = rightTarget.transform.position.x - rightTarget.BodyRadius - BodyRadius;
if (TargetX - x > BattleConfigure.DistanceDash)
{
TargetX = x + BattleConfigure.DistanceDash;
}
TargetZ = rightTarget.transform.position.z;
Direction = direction;
}
targetPosition = new Vector3(TargetX, 0.0f, TargetZ);
var distance = (targetPosition - transform.position).magnitude;
if (isAttack)
{
moveSpeed = Math.Abs(distance / BattleConfigure.NormalMoveTime);
}
else
{
moveSpeed = Math.Abs(distance / BattleConfigure.NormalBackTime);
}
}
else
{
BattleControlUnit leftTarget = null;
BattleControlUnit rightTarget = null;
BattleMgr.GetNearestDefUnit(x, z, out leftTarget, out rightTarget);
if (ReferenceEquals(leftTarget, null)) // 左边没有敌人
{
if (ReferenceEquals(rightTarget, null)) // 右边也没有敌人则向该方向进行常规攻击,同时推进
{
if (BattleMgr.GetEffectWarningCount() <= 0)
{
TargetX = x - BattleConfigure.DistanceAttack;
TargetZ = transform.position.z;
Direction = direction;
}
else
{
TargetX = x - BattleConfigure.DistanceBack;
TargetZ = transform.position.z;
isAttack = false;
}
}
else // 右边有敌人,则向该方向进行后撤,并且当前朝向不变
{
TargetX = x - BattleConfigure.DistanceBack;
TargetZ = transform.position.z;
isAttack = false;
}
}
else // 左边有敌人,向目标进行冲锋推进攻击
{
TargetX = leftTarget.transform.position.x + leftTarget.BodyRadius + BodyRadius;
if (x - TargetX > BattleConfigure.DistanceDash)
{
TargetX = x - BattleConfigure.DistanceDash;
}
TargetZ = leftTarget.transform.position.z;
Direction = direction;
}
targetPosition = new Vector3(TargetX, 0.0f, TargetZ);
var distance = (targetPosition - transform.position).magnitude;
if (isAttack)
{
moveSpeed = Math.Abs(distance / BattleConfigure.NormalMoveTime);
}
else
{
moveSpeed = Math.Abs(distance / BattleConfigure.NormalBackTime);
}
}
return isAttack;
}
public int GetNearestLeftRightUnit()
{
BattleControlUnit leftTarget = null;
BattleControlUnit rightTarget = null;
BattleMgr.GetNearestDefUnit(transform.position.x, transform.position.z, out leftTarget, out rightTarget);
if (ReferenceEquals(leftTarget, null))
{
if (ReferenceEquals(rightTarget, null))
{
return 0; // 两边都没有敌人
}
else
{
return 2; // 只有右边有敌人
}
}
else
{
if (ReferenceEquals(rightTarget, null))
{
return 1; // 只有左边有敌人
}
else
{
var leftDistance = Mathf.Abs(transform.position.x - leftTarget.transform.position.x);
var rightDistance = Mathf.Abs(transform.position.x - rightTarget.transform.position.x);
if (leftDistance < rightDistance)
{
return 1; // 左边的敌人离得更近
}
else
{
return 2; // 右边的敌人离得更近
}
}
}
}
public override bool GetWhetherUseGroundSkill()
{
var unit = BattleMgr.GetNearestDefUnitOnCurrDirection(transform.position.x, transform.position.z, Direction);
if (ReferenceEquals(unit, null))
{
return false;
}
return unit.IsInGroundState;
}
public void StopMove()
{
isMoving = false;
}
public void StartMove()
{
isMoving = true;
}
private float GetMoveSpeed()
{
return moveSpeed;
}
public override void OnDead()
{
IsDead = true;
IsInGroundState = false;
}
public override void Reborn()
{
IsDead = false;
}
public override void Revive()
{
IsDead = false;
}
public override void Clear()
{
luaOnHitTargetFunc = null;
if (isHaveHpBar)
{
BattleMgr.PoolHelper.PutBackHpBar(hpBar, Side);
hpBar = null;
isHaveHpBar = false;
}
}
void Update()
{
if (!isMoving)
{
return;
}
if ((transform.position - targetPosition).sqrMagnitude < 0.0001)
{
return;
}
var moveToPosition = Vector3.MoveTowards(transform.position, targetPosition, GetMoveSpeed() * Time.deltaTime*BattleConfigure.TimeScale);
if (moveToPosition.x < BattleConfigure.SceneMinX)
{
moveToPosition.x = BattleConfigure.SceneMinX;
}
else if (moveToPosition.x > BattleConfigure.SceneMaxX)
{
moveToPosition.x = BattleConfigure.SceneMaxX;
}
transform.position = moveToPosition;
}
void LateUpdate()
{
if (IsCameraFollowWithHero)
{
var position = cameraOriginPosition + new Vector3(transform.localPosition.x, 0.0f, 0.0f);
if (position.x < BattleConfigure.CameraMinX)
{
position.x = BattleConfigure.CameraMinX;
}
else if (position.x > BattleConfigure.CameraMaxX)
{
position.x = BattleConfigure.CameraMaxX;
}
mainCamera.transform.position = position;
BattleConfigure.BattleCenterPosX = position.x;
BattleMgr.UpdateEffectTextRootNode();
}
if (isHaveHpBar && isMoving)
{
BattleMgr.UpdateUIPosition(transform.position, HpBarAddY, hpBar.transform as RectTransform);
}
}
private void OnDestroy()
{
luaOnHitTargetFunc = null;
}
}
}