一键改变颜色
为区分在场景中的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站视频。
最后更新于
这有帮助吗?