unity 时间控制(主角与敌人有不同的时间)

类似于日本动漫中的时停系列,主角能动,其他人不能动

先设计主框架

using UnityEngine;

public abstract class GameControllor : MonoBehaviour
{


    //先写一个主框架,用来声明更新的函数
    public abstract void FixedUpdateGame();//一个按照FixedUpdate更新的函数,当然你可以自己定义或者添加,在子类中复写就行了,注意你的需求是基于哪个更新
    public abstract void UpdateGame();//一个按照Update更新的函数,同上
    public abstract void LateUpdateGame();//一个按照LateUpdate更新的函数,同上




}

控制更新频率,暂停的类

using UnityEngine;
public abstract class MyGameControllor : GameControllor
{
    //为什么要写成抽象类的,因为这个控制器本身没有具体的意义,只是控制时间,而且直接控制属性就行了。
    private static bool isStopGame = false;//控制是否暂停

    public static bool IsStopGame
    {
        get { return MyGameControllor.isStopGame; }
        set { MyGameControllor.isStopGame = value; }
    }
    private static float gameTime = 0;//脚本更新的时间,0为正常更新,1代表1秒更新一次

    public static float GameTime
    {
        get { return MyGameControllor.gameTime; }
        set { MyGameControllor.gameTime = value; }
    }
    private static float runtime = 0;//计时器
    private bool IsOnTime = false;

    void Update()//Update更新
    {
        if (IsOnTime)
        {
            UpdateGame();

        }
    }
    void FixedUpdate()//FixedUpdate更新
    {
        if (IsOnTime = (IsRun()))
        {
            FixedUpdateGame();
        }
    }

    void LateUpdate()
    {
        if (IsOnTime)
        {
            LateUpdateGame();
        }


    }
    private bool LateTime()//这个判断是否到了更新的时间
    {
        if (GameTime <= 0) return true;
        runtime += Time.fixedDeltaTime;
        if (runtime >= GameTime)
        {
            runtime = 0;
            return true;
        }
        return false;
    }
    private bool IsRun()//判断是否暂停
    {
        if (!IsStopGame)
        {
            if (LateTime())//不是暂停时判断是否到了更新的时间
            {
                return true;
            }
        }
        return false;
    }
    public override void FixedUpdateGame() { }
    public override void UpdateGame() { }
    public override void LateUpdateGame() { }
}

所有逻辑更新的脚本继承这个MyGameControllor,然后复写你更新的方法就行了

using UnityEngine;
using System.Collections;

public class PlayerMove : MyGameControllor {
    //继承MyGameControllor,并复写UpdateGame方法
    public void Move() {
        //一个简单移动的方法,用来观察测试
        transform.Translate(new Vector3(Random.Range(-1, 1), Random.Range(-1, 1), Random.Range(-1, 1))*Time.deltaTime);
    }
    public override void UpdateGame()
    {
        //复写UpdateGame
        Move();
    }
}

控制时间流动

using UnityEngine;
using System.Collections;

public class SystemTimeControl : MonoBehaviour
{
    [SerializeField] public float runTime = 0.1f;
    bool isChangeTime = false;
    //缓慢持续时间
    [SerializeField] float slowduration = 2f;
    float currenTime = 0f;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            MyGameControllor.IsStopGame = !MyGameControllor.IsStopGame;
        }
        if (Input.GetKeyDown(KeyCode.Space))
        {
            isChangeTime = !isChangeTime;

        }
    }
    private void LateUpdate()
    {
        ChangeTimeFolw();
    }
    void ChangeTimeFolw()
    {
        if (isChangeTime)
        {
            //改变流动时间
            MyGameControllor.GameTime=runTime;
            if (currenTime>slowduration)
            {
                currenTime=0;
                isChangeTime=false;
            }
            else
            {
                currenTime +=Time.fixedDeltaTime;
            }
        }
        else
        {
            //正常时间
            MyGameControllor.GameTime=0;
        }
    }

}

简单Unity时间架构设计(克洛诺斯之匙) - 决晴谷 - 博客园 (cnblogs.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值