关闭

Unity 监听第一次进入播放状态的事件

标签: unity编辑器
1503人阅读 评论(0) 收藏 举报
分类:

原因

由于 Unity 场景没有挂载脚本,当要在编辑器下也可以直接运行游戏时,需要给场景动态挂载脚本,那么就需要知道 Unity 第一次进入播放状态的事件。

编辑器提供了EditorApplication.playmodeStateChanged委托事件,会在播放状态改变的时候进行回调,但是这个事件不止会回调一次,播放、暂停、结束等都会调用这个事件,而且第一次调用时,也不是真正进入播放状态的时机。

详细的调用日志,可参考文章 http://masa795.hatenablog.jp/entry/2013/04/10/100017

当按下Play按钮的时候,会先调用EditorApplication.playmodeStateChanged进行通知播放模式要改变了,此时只有EditorApplication.isPlayingOrWillChangePlaymode变量为True,接着会重新类的构造,此时除了EditorApplication.isPlayingOrWillChangePlaymode,其他变量也都还是False,在接下去的EditorApplication.playmodeStateChanged的时候,EditorApplication.isPlaying变量才为True。

准备

这里写图片描述

方法

那么判断第一次真正游戏播放的事件,就需要结合EditorApplication.isPlayingOrWillChangePlaymode变量和EditorApplication.isPlaying变量,具体代码如下:

using UnityEditor;
using UnityEngine;
using UnityEngine.SceneManagement;

[InitializeOnLoad]
public class GameLauncher
{
    static bool firstPlay = false;

    static GameLauncher()
    {
        EditorApplication.playmodeStateChanged += ChangedPlaymodeState;
    }

    /// <summary>
    /// 会重复进入多次
    /// </summary>
    static void ChangedPlaymodeState()
    {
        if (EditorApplication.isPaused)
        {
            return;
        }
        if (!(EditorApplication.isPlaying && EditorApplication.isPlayingOrWillChangePlaymode))
        {
            return;
        }
        if (firstPlay)
        {
            return;
        }
        firstPlay = true;

        Scene scene = SceneManager.GetActiveScene();
        if (!scene.path.StartsWith("Assets/Scenes/"))
        {
            return;
        }

        // ...... 动态挂载脚本
    }
}
0
0
查看评论

Unity3D之监听Hierachy、Project等视图结构变化的事件

以前就有人问我怎么监听Hierarchy视图中创建或删除变化的事件,当时因为有别的事情就没研究这块。刚好最近有这一类的需求我就学习学习。网上发现了一个日本人写的文档,实现的原理很有意思,内容不错我就翻译一下。 请注意一定把这两个监听的脚本放在Editor文件夹下。 先是基类。 ...
  • linkfly1
  • linkfly1
  • 2015-01-27 20:47
  • 720

用代码控制unityeditor的暂停/播放状态

public static void Play() { EditorApplication.isPlaying = true; } public static void Pause() { EditorApplicati...
  • swmp
  • swmp
  • 2016-06-18 17:42
  • 4815

Unity3D-启动unity事件,切换平台监听

1,启动unity监听,针对unity启动监听,可以做些版本检测,以及平台切换监听,可以做些自己想做的操作 [InitializeOnLoad],添加这个标示,标示在unity启动的时候会执行这个脚本 unity官方给的解释是: Running Editor Script Code on Laun...
  • yhy2218
  • yhy2218
  • 2016-03-03 12:56
  • 1246

[Unity]编辑器中第一次结束游戏后第二次开始游戏崩溃的问题

最近在使用unity编辑器的过程中,总是遇到第二次运行游戏unity直接crash的问题,甚为苦恼。 经反复试验,发现在第一次游戏结束后,在编辑器模式下切换一下场景再切换回开始场景后运行游戏能顺利执行。 知道了怎么避免,那么只需要Edirot代码来自动化这一过程了。监听编辑器退出游戏运行的事件,...
  • RICKShaozhiheng
  • RICKShaozhiheng
  • 2018-01-18 01:20
  • 130

Unity中游戏暂停和开始怎么实现?

(1)Time.timeScale = 0 可以暂停游戏,Time.timeScale = 1 恢复正常,但这是作用于整个游戏的设置,不单单是当前场景,记得在需要的时候重置回Time.timeScale = 1。当然也可以使用Time.timeScale来做游戏的1倍、2倍整体加速。 (2)time...
  • qiaoquan3
  • qiaoquan3
  • 2016-05-07 18:09
  • 17931

Unity动画播放结束事件

animator.SetBool("IsAttack", true);这是我动画播放的触发条件 我播放了一个动画,希望动画播放完成后就执行一个事件 这种事件有2种添加方法,一种就是直接修改动画,在动画中添加事件 另一种以代码判断该动画播放结束 我个人更喜欢用代码解决这是用...
  • qq_34244317
  • qq_34244317
  • 2017-12-08 22:46
  • 236

unity5.6新功能VideoPlayer播放声音,判断视频播放完毕,以及遇到的坑总结

总体使用方式如下 http://blog.csdn.net/dark00800/article/details/70160463 注意事项: 1、如果要播放声音,需要对VideoPlayer挂载的gameObject在增加Audio Source,并且把VideoPlayer的Audio ...
  • jwxkk
  • jwxkk
  • 2017-10-12 18:41
  • 2178

【Unity3d】5.6新系统——Video Player

不久前Unity正式发布了5.6版本,作为5.x版本的最后一版还是有不少给力的更新的。其中新加入了一个Video Player控件,用以取代之前的MovieTexture。虽然还是alpha版本的功能,但是在视频导入编辑和播放等功能上比之前的MovieTexture已经好上很多。当然Unity还是保...
  • dark00800
  • dark00800
  • 2017-04-13 18:37
  • 13340

Unity3d开发(十八) 监听编辑器状态改变,制定自定义回调

做编辑器插件时,我总是想要拿到监听编辑器的状态变化。比如在打开编辑器开始运行自己的服务。这时就需要用户打开编辑器的事件。另一方面,我希望用观察者模式,并且能自动化注册。因为我注意到,导入资源时的 AssetImporter 回调就是这样做的。用户只需要实现一个接口,就可以收到回调。极大的简化了扩展流...
  • fansongy
  • fansongy
  • 2016-11-24 11:52
  • 4798

Unity3D 学习笔记8 —— UGUI控制和按钮的监听系统

一、UGUI简介:         随着Unity原生UI系统UGUI日渐完善,如今在项目中使用UGUI相较于NGUI更为简单快捷,因为NGUI的基于深度(depth属性)层级管理机制和图集式图片管理(图集和散图必须同时存在,占用两倍空间)显然很繁琐而且灵活性...
  • linshuhe1
  • linshuhe1
  • 2016-04-12 10:43
  • 4772
    个人资料
    • 访问:3556397次
    • 积分:36087
    • 等级:
    • 排名:第136名
    • 原创:402篇
    • 转载:88篇
    • 译文:5篇
    • 评论:3425条
    个人说明
    联系方式:
    文章存档
    最新评论