改变光强度Unity多人游戏

时间:2017-03-29 17:10:15

标签: unity3d lighting unity-networking

我在尝试在多人游戏中改变光线强度时遇到了一个问题。

对于开始游戏的人,主人,光强度变化很好。然而,连接到主机的人,他们的光强度不会改变。

我正在尝试使用[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();
     }
 }

我的问题是光线强度只会改变一个玩家,主人。我想要为连接到游戏的所有玩家改变光强度。欢迎任何建议。

2 个答案:

答案 0 :(得分:0)

相当简单的修复 - 如果'isLocalPlayer'为false,则不会给脚本提供替代。

这是一个固定的光变化:

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);
     }
 }

答案 1 :(得分: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;实际强度。