【Unity3D-Mirror多人坦克大战】角色自定义生成、生成位置的随机、分组UI制作和显示(六)

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)

测试

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~Lomiss~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值