类似于日本动漫中的时停系列,主角能动,其他人不能动
先设计主框架
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;
}
}
}