首页 > 其他分享 >通过MenuItem在场景中生成GameObject

通过MenuItem在场景中生成GameObject

时间:2023-04-09 21:34:13浏览次数:47  
标签:Selection 函数 activeObject GameObject 场景 InstantiatePrefab MenuItem

MenuItem Attribute允许你在主菜单中添加新的选项。而这个菜单选项来自于一个静态函数。

public class TestMenuItem
{
    // Creates a new menu item 'Examples > Create Prefab' in the main menu.
    [MenuItem("TestMenuItem/Create Prefab")]
    static void CreatePrefab()
    {
        Debug.Log("do something");
    }
}

上面的代码会产生一个如下图所示的菜单。点击这个选项,就会产生日志信息。

我们还可以对这个选项添加热键,比如如果我们希望按下alt+g触发这个函数。那么可以修改注解为"TestMenuItem/Create Prefab &g" 对应关系为 % (ctrl), ^ (ctrl), # (shift), & (alt).

Some special keyboard keys are supported as hotkeys. For example, "#LEFT" would map to Shift-Left. The keys supported like this are: LEFT, RIGHT, UP, DOWN, F1 .. F12, HOME, END, PGUP, PGDN, INS, DEL, TAB, and SPACE.

比如下面的代码,当我们在project面板选中一个prefab,然后按下ctrl+g,就会在场景中实例化一个这样的对象,并且打印日志。

public class Example
{
    [MenuItem("Examples/Instantiate Selected %g")]
    static void InstantiatePrefab()
    {
        /*Selection.activeObject =*/
        PrefabUtility.InstantiatePrefab(Selection.activeObject as GameObject);
        Debug.Log($"InstantiatePrefab {Selection.activeObject.name}");
    }

}

但是当我们对着C#代码按下Ctrl+g的时候,虽然没有在场景中生成什么,但会显示对应的日志,说明也触发了这个函数。这在某些情况下可能不是我们希望的结果,我们可以通过添加一个新的函数来实现拦截对这个函数的调用。

public class Example
{
    [MenuItem("Examples/Instantiate Selected %g")]
    static void InstantiatePrefab()
    {
        /*Selection.activeObject =*/
        PrefabUtility.InstantiatePrefab(Selection.activeObject as GameObject);
        Debug.Log($"InstantiatePrefab {Selection.activeObject.name}");
    }

    [MenuItem("Examples/Instantiate Selected %g", true)]
    static bool ValidateInstantiatePrefab()
    {
        GameObject go = Selection.activeObject as GameObject;
        if (go == null)
        {
            Debug.Log($"Validate false");
            return false;
        }

        return PrefabUtility.IsPartOfPrefabAsset(go);
    }
}

这样我们可以看到日志不再显示 “InstantiatePrefab ”,说明拦截函数中返回false成功拦截对原有函数的调用。

标签:Selection,函数,activeObject,GameObject,场景,InstantiatePrefab,MenuItem
From: https://www.cnblogs.com/dewxin/p/17301030.html

相关文章

  • golang 中的 goto 用法和使用场景(转)
    转自:golang中的goto场景一:跳出多重循环packagemainimport"fmt"funcmain(){forx:=0;x<10;x++{fory:=0;y<10;y++{ify==2{//跳转到标签gotobreakHere}......
  • Go接口:运维开发场景中,go的接口到底怎么用?
    golang的接口是什么在Golang中,接口是一种类型,它是由一组方法签名组成的抽象集合。接口定义了对象应该具有的行为,而不关心对象的具体实现。实现接口的对象必须实现接口定义的所有方法,这样才能称为该接口的实现。什么情况下要用接口定义通用的方法:接口可以定义一组通用的方法,......
  • 【路径规划】基于模型预测人工势场MPAPF求解考虑复杂遭遇场景的 COLREG船舶运动规划附
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 电商API原数据接口的应用场景
    电商API的作用主要有以下几点:1.方便第三方开发商和合作伙伴开发扩展应用,提升电商平台的业务价值。2.提高电商平台的运营效率和管理水平,缩短数据处理和交互的时间。3.对外提供规范统一的数据接口,降低了系统间的耦合度,保证了平台数据的安全性和稳定性。4.为电商平台的数据分析和......
  • 如何设计高效的基准场景?揭秘大厂的实战策略!
    RESAR性能工程中,场景分为基准、容量、稳定性、异常。每类场景对应不同目标。基准场景是为找到系统中明显配置及软件Bug,也为容量场景提供可对比的基准数据。基准场景要有确定结论。线程数应该如何确定,压力线程的连续递增的重要性,以及如何将之前所讲的分析思路应用在具体的分析案例中......
  • Go RWMutex:高并发读多写少场景下的性能优化利器
    原创文章,如需转载请联系作者:陈明勇公众号:Go技术干货前言在这篇文章GoMutex:保护并发访问共享资源的利器中,主要介绍了Go语言中互斥锁Mutex的概念、对应的字段与方法、基本使用和易错场景,最后基于Mutex实现一个简单的协程安全的缓存。而本文,我们来看看另一个更高效的......
  • EasyCVR在公共资源交易中心监控视频汇聚项目中的场景应用方案
    一、背景分析2019年5月,国务院办公厅印发了《国务院办公厅转发国家发展改革委关于深化公共资源交易平台整合共享实施意见的通知》(国办函〔2019〕41号),明确深化公共资源平台整合共享,要求地方各级人民政府制度细化落实工作方案,实现公共资源交易平台纵向全面贯通、横向互联互通,打造全区......
  • m基于flocking算法的无人机群空间避障飞行matlab仿真,对比二维场景和三维场景
    1.算法描述        近年来,随着通信网络、人工智能、自主系统、大数据的前沿技术的发展,无人机蜂群作战也正在由概念变成现实,从理论走向实践。航迹规划,多机协作,集群控制等问题成为当下研究热点。在军事作战中派遣多无人机协同作战相比于单无人机能够在穿透敌方防御系统,......
  • 火山引擎数智平台拆解 APP改版场景中蕴含的数据思维
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 你有没有遇到过,打开一款经常使用的APP,它却跳出一条需要你升级版本的提示? 大多数情况下,用户可能会直接点击「现在升级」或「稍后提醒我」,如果选择了后者,那接下来每一次使用APP,用户就会......
  • 火山引擎数智平台拆解 APP改版场景中蕴含的数据思维
     更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群你有没有遇到过,打开一款经常使用的APP,它却跳出一条需要你升级版本的提示?大多数情况下,用户可能会直接点击「现在升级」或「稍后提醒我」,如果选择了后者,那接下来每一次使用APP,用户就会再次收到......