游戏场景的转换——状态模式

这篇具有很好参考价值的文章主要介绍了游戏场景的转换——状态模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

状态模式
游戏比较复杂时,通常会设计成多个场景。
切换场景的好处
1、重复使用场景

跳转切换场景的代码有两种一种是旧版的方法 Application.LoadLevel(“SampleScene”);另一种是新版的方法 SceneManager.LoadScene(“SampleScene”);

例子1:通过场景名来加载,并且不销毁之前的场景

using UnityEngine;
using UnityEngine.SceneManagement;//使用场景管理器
 
public class ExampleClass : MonoBehaviour{
 
    void Start()
    {
        //使用LoadScene加载场景
        //第二个参数AddSceneMode.Additive表示当前场景不销毁,并加载需要的场景
        SceneManager.LoadScene("OtherSceneName", LoadSceneMode.Additive);
    }
}

例子2:通过索引来加载,销毁当前场景

using UnityEngine;
using UnityEngine.SceneManagement;//使用场景管理器
 
public class ExampleClass : MonoBehaviour{
 
    //跳转场景
    void LoadLevel(int level)
    {        
        ScenesArgs e = new ScenesArgs();
        //获取当前场景索引
        e.scnesIndex = SceneManager.GetActiveScene().buildIndex;
        //发送退出场景事件
        SendEvent(Consts.E_ExitScenes, e);
        //发送加载新的场景事件
        //LoadSceneMode.Single:销毁当前场景,加载要加载的场景
        SceneManager.LoadScene(level,LoadSceneMode.Single);
 
    }
}
 

游戏场景的转换的写法

private string m_state = "开始";
	public void ChangeScene(string StateName)
	{
		m_state = StateName;
		switch (m_state)
		{
			case"菜单":
                Application.LoadLevel("MainMenuScene");
				break;
			case "主场景":
				Application.LoadLevel("StartScene");
				break;
			case "战斗场景":
				Application.LoadLevel("BattleScene");
				break;
				

		}
	}

    void Update()
    {
        switch (m_state)
        {
            case "开始":
                break;
            case "菜单":
                break;
            case "主场景":
                break;
        }
}

这种方法的弊端,
1、只要增加一个状态,则所有的Switch(m_state)的程序代码都需要增加对应的程序代码
2、与每一个状态有关的对象,都必须在SceneManager类中被保留,当这些对象被多个状态共享时,容易产生混淆。

状态模式
两个主要的类分别是Context(状态拥有者)、State(状态接口类)
游戏场景的转换——状态模式
Context(状态拥有者)
1、具有“状态”属性的类,可以指定相关的接口,让外界能够得知状态的改变或通过操作让状态改变。
2、有状态属性的类
例如,玩家战斗中、待机中、交易中,等等不同的状态。
State(状态接口类)
1、指定状态的接口,负责规范Context(状态拥有者)在特定状态下要表现的行为。
ConcreteState(具体状态类)
1、继承自State
2、实现Context(状态拥有者)在特定状态下该有的行为。
例如,玩家待机中,该有的玩家动作、玩家模型动画,等不同的行为。

状态模式的实现

public abstract  class State//状态
    {
        protected Context m_Context = null;//状态拥有者
        public State(Context context)//构造函数
        {
            m_Context = context;
        }
        public abstract void Handle(int Value);//该状态执行的方法,作为派生类重写
    }

 public class ConcreteStateA : State//状态A
    {

        public ConcreteStateA(Context concrete) : base(concrete)//base可以能将基类的方法掉用出来,将拥有者赋给该状态。
        { }
        public override void Handle(int Value)
        {
         
            if (Value > 10)
            {
                m_Context.SetState(new ConcreteStateB(m_Context));   
                Console.WriteLine("A.Handle");
            }
        }
    }

    public class ConcreteStateB : State
    {

        public ConcreteStateB(Context concrete) : base(concrete)
        {

        }
        public override void Handle(int Value)
        {
           
            if (Value > 20)
            {
                m_Context.SetState(new ConcreteStateC(m_Context));
                Console.WriteLine("B.Handle");
            } 
        }
    }

    public class ConcreteStateC : State
    {

        public ConcreteStateC(Context concrete) : base(concrete)
        {

        }
        public override void Handle(int Value)
        {
           
            if (Value > 30)
            {
                m_Context.SetState(new ConcreteStateA(m_Context));
                Console.WriteLine("C.Handle");
            }
        }
    }

 public class Context
    {
        State m_State = null;
        public void Request(int Value)//执行方法
        {
            m_State.Handle(Value);
        }

        public void SetState(State theState)//设置状态
        {
            Console.WriteLine("状态设置为"+theState);
            m_State = theState;
        }
    }


class Program
    {
        static void Main(string[] args)
        {
            Context context = new Context();
            context.SetState(new ConcreteStateA(context));
            context.Request(5);
            Console.WriteLine("------------------");
            context.Request(15);
            Console.WriteLine("------------------");
            context.Request(25);
            Console.WriteLine("------------------");
            context.Request(35);
            Console.ReadLine();
         
        }
    }

游戏场景的转换——状态模式文章来源地址https://www.toymoban.com/news/detail-470691.html

到了这里,关于游戏场景的转换——状态模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 项目实训--Unity多人游戏开发(十一、PUN框架--游戏场景篇(加载与同步))

    本地加载 有许多方法,举几个例子: 本地加载 本地异步加载(场景内容过多时,防止卡顿异步加载) 多人游戏加载场景 pun2插件加载 这个异步加载起初是觉得场景内容如果过多会引起卡顿。所以把这个应用在了单机模式上。 至于多人游戏加载场景,可能用不到而且也没法

    2024年02月01日
    浏览(59)
  • 关于Unity在游戏运行过程中切换场景导致场景变暗的问题

    相信很多新手都会遇到这个问题,那就是你正常打开的时候没有任何问题,但当你在游戏运行过程中切换场景的时候,目标场景会莫名其妙的变暗。这个问题在网上有很多教程,但是可能是对于老手们太简单的原因,所以很多人都是一句话带过,但是对于新手来说可能会让他

    2024年02月04日
    浏览(55)
  • Unity 关卡跳转——开始界面切换到游戏场景的实现

    1 .在已有关卡的基础上,另外新建一个关卡,将其命名为start并进行保存。 2 .在新建立的start关卡中创建TitleScreen.cs脚本,代码如下。 (值得注意的是,这里不要忘记使用unity引擎提供的SceneManagement类,即在脚本顶部添加 using UnityEngine.SceneManagement;) 3 .将TitleScreen.cs脚本挂载到

    2024年02月11日
    浏览(42)
  • Unity3D项目之游戏场景小地图制作

    创建一个场景资源,可在asset store资源商店下载,选择心仪场景。 链接:https://assetstore.unity.com/?locale=zh-CN 添加一个对象GameObject,命名为player,子物体包括:主摄像机,角色,后面步骤会添加一个plane。 添加一个地图摄像机,命名为MapCamera。修改属性projection为OrthoGraphic;Size为

    2024年02月11日
    浏览(70)
  • Unity学习之坦克游戏制作(1)开始场景的制作

    相当于开始界面,想怎么创建就怎么创建 我最终模拟的效果 这部分不关键,关键的是创建可用来装载脚本的button 这部分感兴趣的可以去看我博客的GUI部分,但建议大家把学GUI的时间拿来学UGUI 导入预设体 Root 创建一格Label组件作为标题 这部分也可以自己创建 同时创建四个按

    2024年01月22日
    浏览(48)
  • 1.17 从0开始学习Unity游戏开发--场景切换

    前面的所有文章我们都在一个固定的游戏场景内进行开发,在最开始介绍场景这个概念的时候就已经提及,这个场景可以是一张地图,或者是一个对战房间等等,所以显然这个场景可以有多个,并且可以从一个场景切换到另外一个场景,那么在Unity中如何进行场景切换,以及

    2024年02月04日
    浏览(43)
  • 关于Unity游戏开发场景切换:Time.timeScale的捣乱

    在制作场景切换功能的时候,我用的是SceneManager.LoadScene函数,从主界面场景切换到关卡1场景,从关卡1场景切换到关卡2场景都是没有问题的。 但是,当我在点击Pause按钮来到暂停界面,点击Back Menu按钮准备回到主界面场景时,只显示了一片空白,场景没有被完全加载。 我的

    2024年02月05日
    浏览(35)
  • 【Overload游戏引擎细节分析】画场景栅格的Shader分析

    Overload引擎地址: GitHub - adriengivry/Overload: 3D Game engine with editor 一、栅格绘制基本原理 Overload Editor启动之后,场景视图中有栅格线,这个在很多软件中都有。刚开始我猜测它应该是通过绘制线实现的。阅读代码发现,这个栅格的几何网格只有两个三角形面片组成的正方形,使

    2024年02月07日
    浏览(39)
  • 在FPS游戏中,哪些场景需要服务器事件驱动同步

    玩家位置和运动同步:服务器负责跟踪每个玩家的位置和运动,并将这些信息同步到所有其他玩家,以确保每个人都看到相同的玩家移动。 射击和命中检测:当玩家射击时,服务器会处理射击事件,包括命中检测和伤害计算,然后将结果同步给所有玩家。 武器和装备状态:

    2024年04月17日
    浏览(34)
  • Unity3D学习记录01:URP渲染管线以及3D游戏场景设置

    以下内容所使用的版本均为Unity2022.3 先在 Window-Package Manager-Unity Registry 里面搜索添加Universal RP   Unity中,创建渲染管线的方式为Asset文件夹下右键 Create-Readering-URP Asset(with Universal Asset) 会创建以下两个Pipeline:  接着在图中的设置里添加这两个渲染管线(Project Setting在Edit窗口下

    2024年02月08日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包