一键改变模型

为区分在场景中的Player, Player可以使用不同的模型。

一、加入一个Cube,改名Player2,作为第二种模型。与Player一样,也要加入TransformComponent.cs和PlayerController.cs

二、将Player2作为Prefab

三、在NetworkManager的MyClientSceneManager的Prefabs增加一项,将Player2拖入。

四、根据索引项更改Player2的TransformComponent的Index

获得Index值
设置Player2的Index值

五、修改PlayerController.cs。加入按B键更换模型

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

        // 按B键改变Player模型
        if (Input.GetKeyDown(KeyCode.B))
        {
            GameObject.Find("GameManager").GetComponent<GameManager>().SpawnPlayer(1, transform.position, transform.rotation);
            Destroy(gameObject);
        }
    }
}

六、修改GameManager.cs。

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

public class GameManager : MonoBehaviour
{
    public List<GameObject> PlayerPrefabs;

    private void Start()
    {
        ClientManager.Instance.client.OnConnectedHandle += Connected;
    }

    private void Connected()
    {
        SpawnPlayer(0, Vector3.zero, Quaternion.identity);
    }

    public void SpawnPlayer(int _modelIndex, Vector3 position, Quaternion rotation)
    {
        NetworkTransformBase.Identity = ClientManager.UID;

        GameObject _player = Instantiate(PlayerPrefabs[_modelIndex], position, rotation);
        _player.GetComponent<PlayerController>().enabled = true;
    }
}

注意:至此,一键改变模型已经可以正常使用,但是,这不是完美的处理,你依然会发现Bug。怎么解决,请看我的B站视频

最后更新于

这有帮助吗?