Unity Gun Ammo 在多人游戏中没有减少问题(可能与我的多人游戏系统:光子有关)

Posted

技术标签:

【中文标题】Unity Gun Ammo 在多人游戏中没有减少问题(可能与我的多人游戏系统:光子有关)【英文标题】:Unity Gun Ammo not Decreasing Problem in Multiplayer (Maybe Related To my Multiplayer System: Photon) 【发布时间】:2021-11-05 17:58:38 【问题描述】:

我有一个问题,我射击时弹药不会减少,直到我等待一定的时间。我目前使用 Photon 作为我的游戏的网络系统和来自 Brackeys (https://www.youtube.com/watch?v=kAx5g9V5bcM&lc=UghlAulu5dH90HgCoAEC) 的枪支代码。这可能与互联网问题和延迟有关,但我会向您展示我使用的代码:

void Update()


    if(!photonView.IsMine) return;

    if (!canShowAmmo)
    
        ammoText.text = "Ammo: " + currentAmmo;
    

    if (isStarted && (owner.openPanel || MultiplayerManager.main.roomManager.gameDone))
    
        if (isScoped)
        
            Scope();
        
        return;
    

    if (currentAmmo <= 0)
    
        StartCoroutine(Reload());
        return;
    
        

    if(autoOrSemi == true)
        if(Input.GetButton("Fire1") && Time.time >= nextTime)
            nextTime = Time.time + 1f/fireRate;
            Shoot();
        
    
    if(autoOrSemi == false)
        if(Input.GetButtonDown("Fire1") && Time.time >= nextTime)
            nextTime = Time.time + 1f/fireRate;
            Shoot();
        
    

    if (Input.GetButtonDown("Fire2"))
    
        Scope();
    




public void Shoot()
    MuzzleFlash.Play();

    currentAmmo--;

    Audiosource.PlayClipAtPoint(shotSound, transform.position);

    RaycastHit hit;
    if (Physics.Raycast(fpsCam.transform.position, fpsCam.transform.forward, out hit, range))
        Debug.Log(hit.transform.name);

        IDamageable target = hit.collider.gameObject.GetComponent<IDamageable>();

        if (target != null)
        
            if (hit.collider != owner.GetComponent<Collider>())
            
                target.TakeDamage(damage);
                owner.score += (int) damage;
                owner.ScoreUpdate();
            
        

        if(hit.rigidbody != null)
            hit.rigidbody.AddForce(-hit.normal * impactForce);
        

        GameObject effect = Instantiate(impactEffect, hit.point, Quaternion.LookRotation(hit.normal));
        Destroy(effect, 2f);
    


public IEnumerator Reload()
    isReloading = true;
    Debug.Log("Reloading");

    canShowAmmo = true;
    ammoText.text = "Reloading...";
    yield return new WaitForSeconds(reloadTime - .25f);
    
    yield return new WaitForSeconds(.25f);
    canShowAmmo = false;
    
    currentAmmo = maxAmmo;
    isReloading = false;

所以,如果我是正确的并且它是由滞后引起的,或者我错了并且与网络没有任何关系,我需要一个解决方案。谢谢。

【问题讨论】:

除了函数Reload之外,你在哪里设置canShowAmmo?您只是在问为什么文本组件没有更新吗?我认为这是因为不满足条件if (!canShowAmmo),所以它没有更新文本字段。 所以现在我必须删除 canShowAmmo 布尔值? 【参考方案1】:

我认为你的问题是并发协程!

你在做

if (currentAmmo <= 0)

    StartCoroutine(Reload());
    return;

这将在满足条件时每一帧开始一个新的例程。

你宁愿做例如

if (!isReloading && currentAmmo <= 0)

    StartCoroutine(Reload());
    return;


if(isReloading) return;

【讨论】:

但是当它还在重新加载时,我可以射击! 试用更新版本。现在,如果您正在重新加载,您将无法再做任何事情;)您可能想要移动上面的范围【参考方案2】:

对不起,我可能刚刚找到了一个解决方案:只需添加一个新的私有 bool 并将其设置为在 if 函数 derHugo 中显示在此评论下方或上方,如果 bool 为 false,则在重新加载后禁用拍摄isReloading = false 后的枚举器,使 bool 为 false

【讨论】:

嗨@FenderSelim,你找到了一个解决方案真棒,我相信你可以通过更新你在帖子中解释的代码来大大提高你的答案的可读性。

以上是关于Unity Gun Ammo 在多人游戏中没有减少问题(可能与我的多人游戏系统:光子有关)的主要内容,如果未能解决你的问题,请参考以下文章

没有服务器的 Unity3D 中的内置多人游戏?

我可以在 Unity Android Free 中使用 Google Play 游戏服务 - 实时多人游戏吗?

使用 Photon Unity Network(多人游戏)在 Unity 中实时同步

在 Unity Billiard 游戏上实现多人游戏的最佳方法是啥?

Unity 中的多人游戏

Steamworks and Unity – P2P多人游戏