一键改变颜色

为区分在场景中的Player,我们将Player的颜色改变。

一、修改MyCommand,添加新的常量

using System;
using System.Collections.Generic;
using System.Text;
using Net.Component;

public class MyCommand : Command
{
    public const byte ChangePlayerColor = 50;
}

客户端和服务器端的MyCommand.cs文件要保持一致,所以两端都要修改。

二、修改客户端PlayerController.cs文件。按C键发送改变Player的颜色指令MyCommand.ChangePlayerColor,我们随机指定一种颜色作为修改后的颜色。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Net.Component;
using Net.Share;

public class PlayerController : MonoBehaviour
{
    public float speed = 8f;

    private void Update()
    {
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            transform.Translate(Vector3.left * speed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.Translate(Vector3.right * speed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.UpArrow))
        {
            transform.Translate(Vector3.forward * speed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.DownArrow))
        {
            transform.Translate(Vector3.back * speed * Time.deltaTime);
        }

        //发送改变Player颜色指令
        if (Input.GetKeyDown(KeyCode.C))
        {
            var _index = GetComponent<TransformComponent>().identity;
            ClientManager.AddOperation(new Operation(MyCommand.ChangePlayerColor, _index)
            {
                buffer = new byte[]
                        {
                           (byte)Random.Range(0,255),    //R
                           (byte)Random.Range(0,255),    //G
                           (byte)Random.Range(0,255)     //B
                        }
            });
        }
    }
}

三、修改客户端MyClientSceneManager.cs。加入接收MyCommand.ChangePlayerColor指令,并进行处理

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Net.Share;
using Net.Component;
using System;

public class MyClientSceneManager : Net.Component.SceneManager
{
    public override void OnOperationOther(Operation opt)
    {

        switch (opt.cmd)
        {
            case MyCommand.ChangePlayerColor:
                {
                    if (transforms.TryGetValue(opt.index, out NetworkTransformBase t))

                    {
                        t.GetComponent<MeshRenderer>().material.color =

                            new Color32(opt.buffer[0], opt.buffer[1], opt.buffer[2], 255);
                    }

                }
                break;
        }
    }
}

注意:至此,一键改变Player颜色可以实现了,但不是完美的,这只能改变当前在线的客户端,当一个新的客户端上线时就会发现Bug啦。怎么解决这个问题,请看我的B站视频。

最后更新于

这有帮助吗?