【问题标题】:Unity Mirror, Client is not executing damage CommandUnity Mirror,客户端未执行损坏命令
【发布时间】:2021-09-04 07:48:51
【问题描述】:

我在播放器上有一个脚本,可以通过单击它们来获取目标。我检查玩家的自动攻击冷却时间是否为 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;
}

【问题讨论】:

    标签: c# unity3d networking mirror


    【解决方案1】:

    您的 OnHealthChanged 挂钩在哪里实施?使用挂钩的 SyncVars,您必须在挂钩方法中分配更改的变量。在您的情况下,您必须在 OnHealthChanged 中为 currentHealth 分配一个新值。

    现在您的 currentHealth 仅在服务器上更新。

    【讨论】:

    • 欢迎来到 Stack Overflow!我建议不要在答案中使用修辞问题。他们冒着被误解为根本不是答案的风险。您正在尝试回答此页面顶部的问题,不是吗?否则请删除此帖。
    猜你喜欢
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多