76 lines
2.1 KiB
C#
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);
|
|
}
|
|
} |