[Unity]全てのシーンを一括で書き換えるスクリプト

0

    全てのシーンの特定のデータを書き換えたい場合、一個一個シーンを開いて手作業で書き換えるのはものすごい手間だ。

    そのような時にはスクリプトを書いて一括で変換してしまおう。

     

    下記は全てのシーンの宝箱のリスポーンステップ数を書き換えるスクリプトだ。

    このコードをSceneChanger.csとして保存してEditorディレクトリに置く。

    
    using UnityEngine;
    using UnityEditor;
    public class SceneChanger
    {
      [ MenuItem( "Assets/RogueLive/ChangeScenes" ) ]
      static void ChangeScenes()
      {
        UnityEditor.SceneManagement.EditorSceneManager.SaveOpenScenes();
        var currentScene =
          UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene().path;
        var files = System.IO.Directory.GetFiles(
          Application.dataPath, "*.unity", System.IO.SearchOption.AllDirectories );
        for( int i = 0, last = files.Length; i < last; ++ i )
        {
          ChangeScene( files[ i ] );
        }
        UnityEditor.SceneManagement.EditorSceneManager.OpenScene( currentScene );
        Debug.Log( "ChangeScenes" );
      }
    
      static void ChangeScene( string scenePath )
      {
        var mapName = System.IO.Path.GetFileNameWithoutExtension( scenePath );
        if( !mapName.Contains( "Map" ) )
        {
          return;
        }
        UnityEditor.SceneManagement.EditorSceneManager.OpenScene( scenePath );
        var objs = GameObject.FindGameObjectsWithTag( "MapObject" );
        for( int i = 0, last = objs.Length; i < last; ++ i )
        {
          ChangeTreasureRespawnStep( objs[ i ], 1000, 2000 );
        }
        UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(
          UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene() );
        UnityEditor.SceneManagement.EditorSceneManager.SaveScene(
          UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene() );
      }
    
      static void ChangeTreasureRespawnStep( GameObject obj, int now, int next )
      {
        var eventInfo = obj.GetComponent< Events.EventInfo >();
        if( eventInfo != null )
        {
          for( int i = 0, last = eventInfo.Count; i < last; ++ i )
          {
            var eventParam = eventInfo[ i ];
            if( eventParam.enable && eventParam.type == Events.Type.TreasureBox
              && eventParam.GetParam( 0 ) == now )
            {
              eventParam.SetParam( 0, next );
              Undo.RecordObject( eventInfo, "Update" );
              EditorUtility.SetDirty( eventInfo );
              break;
            }
          }
        }
      }
    }
    
    

    ChangeScenes()でアセットディレクトリにある全ての*.unityファイルをリストアップしChangeScene()に渡す。

    ChangeScene()ではシーンをオープンしGameObjectを列挙しChangeTreasureRespawnStep()に渡す。

    ポイントはChangeTreasureRespawnStep()の

    Undo.RecordObject( eventInfo, "Update" );

    EditorUtility.SetDirty( eventInfo );

    で、これが無いとシーンを書き換えて保存してもファイルに反映されない。

    Events.EventInfoはRogueLive独自のクラスである。

    あとはメニューから実行するだけ。

     

     


    ネコジェット

    0

      チャチャの必殺技ネコジェット。高速で後退する。

      後ろを全く確認せずに発動するためよく崖に落ちる。


      「Unity」itemstoreとGoogle AdMobを併用するとビルドでエラー

      0

        アプリ内課金を簡単に実装できるサービス「Itemstore」とGoogleの広告サービス「Google AdMob」をUnity2018で両方導入するとAndroidビルド時にエラーがでた。

         

        Error: Error while saving blame file, build will continue Error: 隕∫エ?繧ソ繧、繝?uses-sdk"縺ォ髢「騾」莉倥¢繧峨l縺ヲ縺?k螻樊?ァ"tools:overrideLibrary"縺ョ謗・鬆ュ霎?tools"縺後ヰ繧、繝ウ繝峨&繧後※縺?∪縺帙s縲? UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr) AndroidSDKToolsException: Unable to merge android manifests. UnityEditor.Android.AndroidSDKTools.DetectErrorsAndWarnings (System.String logMessages, System.String errorMsg) UnityEditor.Android.AndroidSDKTools.RunCommandInternal (System.String javaExe, System.String sdkToolsDir, System.String[] sdkToolCommand, Int32 memoryMB, System.String workingdir, UnityEditor.Android.WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg) UnityEditor.Android.AndroidSDKTools.RunCommand (System.String javaExe, System.String sdkToolsDir, System.String[] sdkToolCommand, Int32 memoryMB, System.String workingdir, UnityEditor.Android.WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg) UnityEditor.Android.AndroidSDKTools.RunCommand (System.String[] sdkToolCommand, UnityEditor.Android.WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg) UnityEditor.Android.AndroidSDKTools.MergeManifests (System.String target, System.String mainManifest, System.String[] libraryManifests, UnityEditor.Android.WaitingForProcessToExit waitingForProcessToExit) UnityEditor.Android.PostProcessor.Tasks.GenerateManifest.MergeManifests (UnityEditor.Android.PostProcessor.PostProcessorContext context, System.String mainManifest, System.String targetManifest) UnityEditor.Android.PostProcessor.Tasks.GenerateManifest.Execute (UnityEditor.Android.PostProcessor.PostProcessorContext context) UnityEditor.Android.PostProcessor.PostProcessRunner.RunAllTasks (UnityEditor.Android.PostProcessor.PostProcessorContext context) UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr) Build completed with a result of 'Failed' UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr) UnityEditor.BuildPlayerWindow+BuildMethodException: 3 errors at UnityEditor.BuildPlayerWindow+DefaultBuildMethods.BuildPlayer (BuildPlayerOptions options) [0x0021f] in C:¥buildslave¥unity¥build¥Editor¥Mono¥BuildPlayerWindowBuildMethods.cs:182 at UnityEditor.BuildPlayerWindow.CallBuildMethods (Boolean askForBuildLocation, BuildOptions defaultBuildOptions) [0x00065] in C:¥buildslave¥unity¥build¥Editor¥Mono¥BuildPlayerWindowBuildMethods.cs:89 UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

         

        以下のようにしたらビルドできるようになった。

         

        まずBuild Systemを「Gradle」から「Internal」に変更

         

        Assets/Plugins/Android/AndroidManifest.xml

        <manifest
        xmlns:android="http://schemas.android.com/apk/res/android"
        package="[パッケージ名]"
        android:installLocation="preferExternal"
        android:versionCode="2"
        android:versionName="1.1">
        

        <manifest
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="[パッケージ名]"
        android:installLocation="preferExternal"
        android:versionCode="2"
        android:versionName="1.1">
        
        

        のように

        xmlns:tools="http://schemas.android.com/tools"

        を追加。

         

        しかしまだ以下のようなエラーがでる。

        これは

        Assets/Plugins/Android/libs/android-support-v4.jar

        がAdmobのプラグインと競合しているのが原因か?

        このファイルを削除したらビルドが通るようになった。

         

        これが正しい対処法かは不明。

         


        ネコブレス

        0

          ネコブレスを吐くカトリーヌ。相手は毒になる。


          樽の上の猫

          0

            何故か樽の上が好きだ


            キャラクター紹介7

            0

              カトリーヌ。ちょっとお姉さんでみんなのリーダー的存在。


              しっぽ比べ

              0

                尻尾だらけ


                キャラクター紹介7

                0

                  メインクエストのヒロインのミケ。ネズミが苦手だ


                  キャラクター紹介6

                  0

                    大キャンプにいる料理人のユリ。冒険には必須の料理スキルを教えてくれる。

                    炎の蹴りを放つ


                    スマートフォン用RPG RogueLiveプレイ動画

                    0


                      | 1/4PAGES | >>