Files
Zombie/Assets/_Zombie/Scripts/Towers/ManualTower.cs

76 lines
2.1 KiB
C#

using Common;
using Mirror;
using UnityEngine;
// --可控制进出,瞄准点位
public class ManualTower : Tower
{
public virtual void Update()
{
if (!isServer)
{
return;
}
ControlChange();
if (!IsAlive || state == TowerState.Broken)
{
return;
}
if ((mode == TowerMode.Manual || mode == TowerMode.Joint) && controllerId != -1)
{
Player player = MRNetworkManager.Ins.roomSlots[controllerId].transform.GetComponent<Player>();
// 看向aim点
if (player.AimVec != Vector3.zero)
{
float angleY = Vector3.SignedAngle(body.forward, player.AimVec - body.position, body.up);
float rotateY = angleY > 0 ? rotateSpeed : -rotateSpeed;
body.localEulerAngles = new Vector3(0, body.localEulerAngles.y + rotateY, 0);
float angleX = Vector3.SignedAngle(head.forward, player.AimVec - head.position, head.right);
float rotateX = angleX > 0 ? rotateSpeed : -rotateSpeed;
head.localEulerAngles = new Vector3(head.localEulerAngles.x + rotateX, 0, 0);
}
}
}
public override void OnSpawn(int id, TowerType type, int lvl)
{
base.OnSpawn(id, type, lvl);
mode = TowerMode.Manual;
originalMode = TowerMode.Manual;
}
[Server]
public void ControlChange()
{
// 死亡
if (!IsAlive || state == TowerState.Broken && useState.nowState != 0)
{
ControlChangeRpc(0);
}
// 未受控
else if (mode == TowerMode.Manual && controllerId == -1 && useState.nowState != 1)
{
ControlChangeRpc(1);
}
// 受控
else if (mode == TowerMode.Manual && controllerId != -1 && useState.nowState != 2)
{
ControlChangeRpc(2);
}
// 联控
else if (mode == TowerMode.Joint && useState.nowState != 3)
{
ControlChangeRpc(3);
}
}
[ClientRpc]
public void ControlChangeRpc(int state)
{
useState.StateChange(state);
}
}