[开发者心得] 游戏里的时间是怎么算的,和真实的时间比例是多少?

[复制链接]
1028 |0
顾北清歌寒吹雪 发表于 2023-6-21 14:16:32 | 显示全部楼层 |阅读模式
本帖最后由 顾北清歌寒吹雪 于 2023-10-30 19:01 编辑

像什么GTA系列,荒野大镖客2、原神、赛博朋克2077等游戏它们都有游戏时间的一个玩法,那么它们是怎么做到游戏里面一天现实中几十分钟的呢?
简单写一个UI显示游戏里的时间的脚本吧


@Component
export default class TimeSet extends mw.Script {

    private _currentTime: number = 0;

    private _nextTime: number = 0;
    /**时间缩放系数,现实一秒游戏中多少秒*/
    private _timeScale:number

    /** 当脚本被实例后,会在第一帧更新前调用此函数 */
    protected onStart(): void {
        let gameScend = (dayEndShow - dayBeginShow) * 3600;//游戏总秒数
        this._timeScale = gameScend / totalTime;//时间缩放系数
        
        this._currentTime = 0;
        this._nextTime = TimeUtil.elapsedTime() + 1;
        this.useUpdate = true;
    }

    protected onUpdate(dt: number): void {
        if(TimeUtil.elapsedTime() >= this._nextTime){
            this._currentTime++;
            this._nextTime = TimeUtil.elapsedTime() + 1;
            this.updateTime();
        }
        if(this._currentTime === totalTime){
            this._currentTime = 0;
        }

    }

    /**更新UI显示时间,天气这些 */
    updateTime(){
        const timestr = this.getMMTimeStr(this._currentTime);
        UI.UIManager.instance.getUI(UIDefault).setTimeTxt(timestr);
    }

    /**
     * 获取游戏中的时间字符串(时 分 )
     * @param time 秒数
     * @returns
     */
    private getMMTimeStr(time: number): string {
        let totalSeconds = time * this._timeScale;
        let hours = Math.floor((totalSeconds % 86400) / 3600);
        let minutes = Math.floor(((totalSeconds % 86400) % 3600) / 60);
        hours += dayBeginShow;
        let hh: string = (hours < 10 ? "0" + hours : hours).toString();
        let mm: string = minutes < 10 ? "0" + minutes : minutes.toString();
        return hh + ":" + mm;
    }


}

/**游戏中日程开始的时间(小时) */
const dayBeginShow: number = 7;

/**游戏中日程结束的时间(小时) */
const dayEndShow: number = 22;

/**游戏中一天现实中需要运行的秒数 */
const totalTime: number = 1500;

简单来说就是根据游戏中自己定义的时间和现实生活中的时间算一个时间缩放比例系数,根据这个系数也能做出其他功能啦


回复

使用道具 举报

热门版块
快速回复 返回顶部 返回列表