Unity Random 随机数测试

近期工作中需要完成一个基于局域网的双人联机游戏原型,游戏中需要两个客户端同步随机结果。由于只是展示用的原型,不需要校验,故我决定使用随机数种子保证随机的结果一致,在进入游戏时使用同个种子初始化。

我写了个简单的测试脚本进行测试,代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 测试随机数种子的使用方法
/// 主要用于多客户端同步
/// </summary>
public class RandomTest : MonoBehaviour
{
    public Text txtLog;//展示测试过程

    private float timer = 0f;//即时
    private int count = 0;//计数
    private int seedIdx = 0;//种子索引计数

    //随机数种子数组
    private int[] SeedArr = new int[10] { 19971017, 19971105, 1, 337845818, 27, 64, 2, 888, 666, 7 };

    //随机范围最小值数组
    private int[] minArr = new int[10] { 0, 1, 0, 2, 1, 0, 3, 1, 0, 0 };

    //随机范围最大值数组
    private int[] maxArr = new int[10] { 1, 10, 0, 3, 4, 10, 9, 999, 9999, 1 };
    // Start is called before the first frame update
    void Start()
    {
        txtLog.text = "";
        InitSeed();//开始时先初始化一次
    }

    // Update is called once per frame
    void Update()
    {
        timer += Time.deltaTime;
        if (timer >= 1f)//每秒展示一次随机数
        {
            timer -= 1f;//使用这样的写法,不将timer直接设为0f,可以避免累积计时误差(但其实99%的情况下无所谓)。
            ShowRandomNum();
        }
    }
    private void InitSeed()//(重新)设置随机数种子
    {
        txtLog.text += $"重设随机种子为{SeedArr[seedIdx % 10]}\n";
        Random.InitState(SeedArr[seedIdx % 10]);
        seedIdx++;
    }
    private void ShowRandomNum()//展示一次随机结果
    {
        count++;
        int rangeIdx = (count - 1) % 10;
        if (count % 5 == 0)
        {
            InitSeed();
        }
        int r = Random.Range(minArr[rangeIdx], maxArr[rangeIdx]);
        Debug.Log($"第{count}次随机,随机范围:({minArr[rangeIdx]},{maxArr[rangeIdx]}), 数值为{r}");
        txtLog.text = txtLog.text + r.ToString() + "\n";
    }
}

代码会根据写死在数组里的数值定期重设随机数种子,每隔1秒会根据数组中配置的随机范围去随机一个int值。这样,每个客户端第n次随机的范围、种子都是一致的,也就模拟了原型中同步随机结果的需求。(由于每次随机相关操作是每个客户端都会执行的,所以在不需要校验的原型项目中,可视为所有客户端每次随机的范围一致。)

打包、双开测试效果如图:
(其实重设随机数种子的时机靠前了一步,但不影响测试结论。)
结论:当使用 UnityEngine.Random 类的 InitState(int seed);方法后,不同客户端的同一次、同范围的随机结果是相同的。

正式项目中也可由服务器发给同一场游戏的每个客户端同个随机数种子,这样每个客户端的“演出”结果就可保证一致。

如有漏洞或错误,欢迎讨论、指正。

(至此的测试结果已经能满足我的简单需求,稍后可能会进行更全面的测试。)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值