0

我目前在尝试更改多人游戏中灯光的强度时遇到问题。

开始游戏的人,主机的光强度变化很好。然而连接到主机的人,他们的光强度并没有改变。

我正在尝试使用 [SyncVar] 更改光强度,但是连接到主机的播放器根本看不到光强度变化。这是我的代码:

 using UnityEngine;
 using System.Collections;
 using UnityEngine.Networking;

 public class dayNightCycle : NetworkBehaviour { //changes day and night based on the wavelevel SpawnManager_waveLevel.cs script

     Light light;
     float fadeTime = 1f;
     [SyncVar(hook = "OnLightAmountChange")]
     float lightAmout = 0f;
     SpawnManager_waveLevel level;

     public override void OnStartLocalPlayer()
     {
         light = GetComponentInChildren<Light>();
         level = GetComponent<SpawnManager_waveLevel>();
         light.intensity = lightAmout;
     }

     // Update is called once per frame
     void Update () {

         changeLight();
     }

     void changeLight()
     {
         if (isLocalPlayer)
         {
             if (level.waveCounter == 1)
             {
                 lightAmout = 0.03f;
                 light.intensity = Mathf.Lerp(light.intensity, lightAmout, fadeTime * Time.deltaTime);
             }
             else
             {
                 lightAmout = 1f;
                 light.intensity = Mathf.Lerp(light.intensity, lightAmout, fadeTime * Time.deltaTime);
             }
         }
     }

     void OnLightAmountChange(float amount)
     {
         lightAmout = amount;
         changeLight();
     }
 }

我的问题是,光强度只对一个玩家,即主机发生变化。我希望所有连接到游戏的玩家的光强度都发生变化。欢迎任何建议。

4

2 回答 2

0

相当简单的修复 - 如果“isLocalPlayer”为假,您不会为脚本提供替代方案。

这是一个固定的灯光变化:

void changeLight()
 {
     if (isLocalPlayer)
     {
         if (level.waveCounter == 1)
         {
             lightAmout = 0.03f;
             light.intensity = Mathf.Lerp(light.intensity, lightAmout, fadeTime * Time.deltaTime);
         }
         else
         {
             lightAmout = 1f;
             light.intensity = Mathf.Lerp(light.intensity, lightAmout, fadeTime * Time.deltaTime);
         }
     }
     else{
         // If not a local player, simply update to the new light intensity.
         light.intensity = Mathf.Lerp(light.intensity, lightAmout, fadeTime * Time.deltaTime);
     }
 }
于 2017-03-29T18:38:50.533 回答
0

通过从此类中完全删除光强度更改逻辑,我能够解决此问题。此类现在如下所示:

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;

public class dayNightCycle : NetworkBehaviour { //changes day and night based on the wavelevel SpawnManager_waveLevel.cs script

    [SerializeField]
    public Light light;

    [SerializeField]
    SpawnManager_waveLevel level;

    [SyncVar(hook = "OnLightAmountChange")]
    public float lightAmout = 0f;

    public override void OnStartLocalPlayer()
    {
        OnLightAmountChange(lightAmout);
    }

    void OnLightAmountChange(float amount)
    {
        light.intensity = amount;
    }
}

我已经着手将改变光强度的条件放入我的 SpawnManager_waveLevel 中,现在它可以正常工作了。我希望这会帮助那些和我面临同样问题的人。

哦,那个类的一个很大的变化是在方法 OnLightAmountChange() 中,我不再设置lightAmout = amount;我现在设置以下,你可以看到light.intensity = amount;实际强度。

于 2017-03-30T01:41:22.793 回答