21、角色自定义生成
在这个地方需要在CustomNetworkRoomManager中进行第二次开发
由于本项目中除了玩家对象,还有个房间对象,本应该在OnServerAddPlayer中进行重写即可,但是Mirror自带的NetworkRoomManager对OnServerAddPlayer已经重写了,但是生成的是房间对象,后面SceneLoadedForPlayer这个函数中找到了对玩家对象的实例,于是对这个函数进行了二次改写:
这个playerPrefab是NetworkManager中的,所以无需定义,除此之外,由于这里对玩家对象生成自定义,所以理应应该将如下选择取消:
但实际上,这里自动创建的player是Roomplayer,不是Gameplayer,所以不能取消。
联机测试:
22、生成位置的随机
在GameManager.cs更新代码:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror;
using Random = UnityEngine.Random;
public class GameManager : NetworkBehaviour
{
……
// 实现随机生成在生成地(cube),并生成的角色互相不碰撞
public Vector3 GetSpawnPosition(int teamIndex)
{
Vector3 pos = teams[teamIndex].spawn.position; // 得到生成位置,为生成地(cube)的中心地点
BoxCollider col = teams[teamIndex].spawn.GetComponent<BoxCollider>(); // 获取生成地(cube)的碰撞组件col
if (col != null)
{
pos.y = col.transform.position.y; // 将碰撞体的y赋值给pos的y,因为y是不需要变的
int counter = 10;
do
{
pos.x = Random.Range(col.bounds.min.x, col.bounds.max.x); // 获得生成地在x轴范围内的随机值
pos.z = Random.Range(col.bounds.min.z, col.bounds.max.z); // 获得生成地在z轴范围内的随机值
counter--;
} while (!col.bounds.Contains(pos) && counter > 0);
}
return pos;
}
}
……
测试:
23、分组UI的制作
将教程中打包好的UI文件导入
新建Canvas(渲染模式为屏幕空间覆盖),然后将UI预制体导入
UI面板分析(教程中的,非自己制作)
24、分组UI的显示
新建UIGame.cs,添加到空对象UI上去
在UIGame.cs中添加代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Mirror;
public class UIGame : MonoBehaviour
{
public Slider[] teamSize;
public void OnTeamSizeChanged(SyncList<int>.Operation op, int index, int oldItem, int newItem)
{
teamSize[index].value = GameManager.GetInstance().size[index];
}
}
在CustomNetworkRoomManager.cs中更新代码:
在GameManager.cs中更新代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror;
using Random = UnityEngine.Random;
public class GameManager : NetworkBehaviour
{
……
public SyncList<int> size = new SyncList<int>();
public UIGame ui;
……
public override void OnStartClient()
{
size.Callback += ui.OnTeamSizeChanged;
for (int i = 0; i < teams.Length; ++i)
{
ui.OnTeamSizeChanged(SyncList<int>.Operation.OP_SET,i,0,0);
}
}
……
}
……
代码中Callback在Unet中是委托的含义,在Mirror中更改如下:
Callback变成事件后,只能是+=或者-=的前面,并且后面的函数需要统一格式:
public void OnTeamSizeChanged(SyncList<Item>.Operation op, int index,
Item oldItem,
Item newItem)