Unity Mirror,客户端未执行损坏命令

时间:2021-06-20 09:19:47

标签: c# unity3d networking mirror

我在播放器上有一个脚本,通过点击它们来获取目标。我检查玩家的自动攻击冷却时间是否为 0 以及玩家是否在射程内。之后它应该运行一个命令并伤害敌方生物。

这只会发生在主机上,而不是客户端上。 如果我在 CmdDamage 函数中删除敌人 != null 检查,客户端就会断开连接。

公共类 PlayerAttacker : NetworkBehaviour

public EnemyScript enemy;

public float timer = 0;
public float timerMax;

private void Start()
{
    timer = timerMax;
}
private void Update()
{
    if (!isLocalPlayer)
        return;       

    if (Input.GetMouseButtonDown(0))
    {
        Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        Vector2 mousePos2d = new Vector2(mousePos.x, mousePos.y);

        RaycastHit2D hit = Physics2D.Raycast(mousePos2d, Vector2.zero);
        if(hit.collider != null && hit.collider.GetComponent<EnemyScript>() != null)
        {
            enemy = hit.collider.GetComponent<EnemyScript>();
            enemy.target.SetActive(true);
        }         
    }
      
    if (timer <= 0)
    {
        timer = 0;
        BasicAttack();
    }
    else if(timer > 0)
    {
        timer -= Time.deltaTime;
    }
}
private void BasicAttack()
{
    float dist = Vector3.Distance(enemy.transform.position, transform.position);
    if(dist < 2.5f)
    {
        GetComponent<NetworkAnimator>().SetTrigger(Animator.StringToHash("sword slash"));           ///SEND TRIGGERS OVER NETWORK
        CmdDamage();
        timer = timerMax;
    }
}
[Command]
private void CmdDamage()
{
    if(enemy != null)
        enemy.TakeDamage(5);
}

公共类 EnemyScript : NetworkBehaviour

    [SyncVar(hook = "OnHealthChanged")] public float currentHealth;   //ADD HP BARS INGAME
public float maxHealth;

[SerializeField] public HealthBar healthBar;

public override void OnStartServer()
{
    currentHealth = maxHealth;
}
public void TakeDamage(float amount)
{
    if (!isServer)
        return;

    currentHealth -= amount;
}

0 个答案:

没有答案