Unityをイラスト作成に使ってみた!!(邪神ちゃんドロップキックイラストコンテスト3)

以前少しだけブログで紹介しましたが、Unityでイラスト作成をしてみました。これは邪神ちゃんドロップキックのイラストコンテスト3のイラストを作成するためにチャレンジしてみたのです!!

最終的に仕上がったのは以下のようなイラストです。

最終的に投稿したイラスト

【作成のきっかけ】
邪神ちゃんドロップキックXの1話目の作画がバラバラになってしまう回を何とかイラストに出来ないかと考えていた時に、ちょうどストVのプロリーグをやっていたので、これだ!!と思い立ちました!
「しっとりしちゃったペルセポネ」対「昭和ギャグアニメ風ぺこら」のバトルです。ちなみに、ペルちゃんが1ラウンド先取し、かつ、EXゲージが2まで溜まっているので、既にぺこらは圧倒的不利!!

【イラストタイトル】
応募の時にはタイトル入力欄が無かったので、タイトルは無いのですが、本来は以下のタイトルを考えていました。

カオス vs. カオス

【使用したツール】
・Unity 2020.3.2f1
・Blender 2.92.0
・Substance Painter 8.2.0
・CLIP STUDIO PAINT PRO 1.10.6
・Illustrator 27.1.1

【作成の手順】
①ラフ

②背景モデル作成 (Blender)

③Unityへ背景モデルを配置
Substance Painterでモデルのテクスチャを作成したのちに、Unityでマテリアル割り当て

④イラストの作成(CLIP STUDIO PAINT)
ちなみに今回は影もイラストで描いている。

⑤UIの作成(Illustrator)

⑥キャラクターイラストとUIをUnityで配置

⑦Unityでエフェクトの追加

⑧UnityのRecorderを使って、レンダリング映像を毎フレーム画像で保存し、よさげな1枚を選定

【失敗したこと】
Unityで背景モデルの影を付けたのだが、上で貼り付けた画像では、背景モデルの影もぼやけているが、コンテストに応募したときの影はぼやけていなかった。つまり、キャラクターの影はぼやけているが、背景モデルの影はぼやけていないという、不自然なイラストになってしまった。原因は、単純に背景モデルの影をUnity側でぼやけた影にする方法がわからなかったからである。しかし、あとで気づいたのだが、LightコンポーネントのModeをBakedにして、Shadow TypeをSoft Shadowsにすればぼやけさせることができた!つまり、ModeをRealTimeにしていたから、全然ぼやけなかったわけである。

【メリット】
・背景まで描かなくてもいいので楽!

【デメリット】
・エフェクトでUnityのパーティクルシステムを使ったが、これはランダムにエフェクトが生成されるので、いい感じのエフェクトを意図的に生成できない。(うまくやる方法はあるのだろうか?)今回は、UnityのRecorderで数百フレームのスクリーンキャプチャを行い、よさげなエフェクトのイラストを選んだ。

全体通して、全てイラストで描くよりは作業時間はかなり削減できたからよかった!!

UnityでAdmobを実装して、iOSビルドが成功するまで!!

だいぶんハマりました。
とりあえず、Androidで広告実装してビルド成功して、実機で広告も確認できたから、もう大丈夫だろうと思って、そのままiOSビルドしようとしたら、色々エラーが出て大変なことになってしまいましたが、一応XCodeでビルドして、iPhone端末でプレイできるところまでできたので、メモを残しておきたいと思います。


まずは、開発環境を以下に示します。
【Windows側】
Windows10
Unity2020.3.4f1

【Mac側】
Mac Mini 2020 M1チップ
MacOS Ventura13.1
Xcode Version14.2

【備考】
Windows側でUnityエディターを開き、iOSプラットフォームに切り替えてビルドして、Xcodeプロジェクトを生成。その後、XcodeプロジェクトのデータをMacへ持っていき、Xcodeでビルド。



Androidでビルドできていた状態から、どうやってiOSでもビルドできるようにしたかを記載したいと思います。対策を順番に書いていっても分かりにくいと思うので、自分が効果のあった対策を箇条書きで書きたいと思います。ちなみに、すべての人に当てはまらない可能性もあるので、使えそうな部分だけ採用してみてください!
【Unity側】
1.Google Admobのバージョンは「7.3.0」を使う
https://github.com/googleads/googleads-mobile-unity/releases/tag/v7.3.0
よくわからないが、最新のバージョンを使うと、XCodeでビルドするときにエラーが発生した。自分の場合は「10 duplicate symbols for architecture arm64」というエラーが出ていた。

1-2.External Dependency Managerをインポートする
以下のGithubのURLをそのままダウンロードし、ダウンロードしたデータの中にあるUnityパッケージをインポート。latestのUnityパッケージをインポートした。
ファイル名「external-dependency-manager-latest.unitypackage」
ちなみに、一応この処理をしたが、もしかしたらGoogle AdmobのUnityパッケージをインポートしてしまったら、もう必要ないのかもしれない。

https://github.com/googlesamples/unity-jar-resolver

2.iOS Resolver Settingsを開き、Cocoapods Integrationを「Xcode Project – Add Cocoapods to the Xcode project」にする。
3.Assetsフォルダ直下に「MyPlugin」というフォルダを作り、その中に「Editor」フォルダを作り、ファイル「MyPluginDependencies.xml」を作り、以下のように記述する。ただ、ここの記述は後でPodfileを書き換えるので、あまり意味がないかもしれない。
<dependencies>

  <!-- Android dependencies are specified under the "androidPackages" element.
       Each "androidPackage" element contains the attributes of an Android
       dependency (e.g AAR, JAR reference). -->
  <androidPackages>
    <!-- Global set of repositories to search for packages.
         These repos will be searched for all packages specified by
         androidPackage. -->
    <repositories>
      <repository>https://repo.maven.apache.org/maven2</repository>
    </repositories>
    <!-- The "spec" attribute is *required* and provides the Maven package
         specification.

         Currently this only supports group:artifact:version_specification where
         group:artifact:version_specification references a Maven package that
         can be located in:
         * Maven central.
         * Google's Maven repo.
         * Local Android SDK Maven repo.

         Additional repositories can be added using the "repositories" element.
    -->
    <androidPackage spec="com.google.android.gms:play-services-games:9.8.0">
      <!-- androidSdkPackageIds is optional and contains the set of Android
           SDK package manager components (packages) this package requires.

           If the package can't be found in any of the specified repositories,
           the dependency resolver will attempt to install the set of Android
           SDK packages specified here and then attempt resolution again.
      -->
      <androidSdkPackageIds>
        <androidSdkPackageId>extra-google-m2repository</androidSdkPackageId>
      </androidSdkPackageIds>
      <!-- "repositories" are optional and contain the set of additional
           repository URIs to search for this package. -->
      <repositories>
        <repository>https://maven.google.com</repository>
      </repositories>
    </androidPackage>
  </androidPackages>

  <!-- iOS Cocoapod dependencies can be specified by each iosPod element. -->
  <iosPods>
    <!-- Global set of sources to search for Cocoapods.
         These sources will be searched for all Cocoapods specified by
         iosPod. -->
<!--    <sources>-->
<!--      <source>https://cocoapods.mycompany.com/Specs</source>-->
<!--    </sources>-->
    <!-- iosPod supports the following attributes:
         * "name" (required)
           Name of the Cocoapod.
         * "path" (optional)
           Path to the local Cocoapod.
           NOTE: This is expanded to a local path when the Podfile is generated.
           For example, if a Unity project has the root path "/my/game" and the
           pod the path is "foo/bar", this will be will be expanded to
           "/my/game/foo/bar" when the Podfile is generated.
         * "version" (optional)
           Cocoapod version specification for the named pod.
           If this is not specified the latest version is used.
           NOTE: This can't be used when "path" is set.
         * "bitcodeEnabled" (optional)
           Whether this Cocoapod requires bitcode to be enabled in Unity's
           generated Xcode project.  This is "true" by default.
         * "minTargetSdk" (optional)
           The minimum iOS SDK required by this Cocoapod.
         * "addToAllTargets" (optional)
           Whether to add this pod to all targets when multiple target is
           supported. This is "false" by default.
         * "configurations" (optional)
           Podfile formatted list of configurations to include this pod in.
         * "modular_headers" (optional)
           Set to true to enable modular headers, false to disable.
         * "source" (optional)
           Source repo to fetch the pod from.
         * "subspecs" (optional)
           Subspecs to include for the pod.
     -->
    <iosPod name="Google-Mobile-Ads-SDK" version="~> 7.0" bitcodeEnabled="false" minTargetSdk="6.0">
      <!-- Set of source URIs to search for this Cocoapod spec.
           By default Cocoapods will attempt to fetch the pod specs from:
           * $HOME/.cocoapods/repos
           * https://github.com/CocoaPods/Specs
           -->
      <sources>
        <source>https://github.com/CocoaPods/Specs</source>
      </sources>
    </iosPod>
  </iosPods>
</dependencies>
4.Project SettingsのOther Settings内にあるIdentificationの部分のBundle IdentifierとSigning Team IDを入力する。
5.iOSのプラットフォームでビルドすると、Xcodeプロジェクトが生成されるが、そのフォルダ内に、「Podfile」が生成されているので、このファイル内の記述を以下のようにする。
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

platform :ios, '11.0'

target 'UnityFramework' do
  pod 'Google-Mobile-Ads-SDK', '~> 9.11'
end
target 'Unity-iPhone' do
end
use_frameworks! :linkage => :static
あとは、生成されたXcodeプロジェクトをMacへ持っていく。 【Mac側】
6.Cocoapodsをインストールする。
  まずは、HomeBrewをインストールし、HomeBrewからCocoaPodsをインストールする。
  https://qiita.com/zaburo/items/29fe23c1ceb6056109fd
  https://qiita.com/MachonglishproK/items/c0434a75f8eae556764b
7.MacのターミナルでカレントディレクトリをXcodeプロジェクトへ移動させて、そこで「pod install」を行う。
cd "Xcodeプロジェクトのパス"
pod install
そうすると、ターミナル内で色々Google Admob関連のファイルがダウンロードされて、おそらくXcodeプロジェクト内に取り込まれていると思われる。

8.Xcodeプロジェクトを開くが、ここで開くときに、「〇〇.xcworkspace」ファイルを選択して開く。
9.Xcodeでプロジェクトを立ち上げ、TARGETS内のUnityFrameworkを選択し、Build Settingsタブをクリックし、「Enable Bitcode」を「No」にする。
これだけの対策を行うことで、とりあえず自分のUnityプロジェクトはiOSでビルドすることができた。
しかし、iOSでビルドしたゲームを見ると、広告が表示されていなかった。どうやら、広告はiOSではアプリの承認が得られないと表示されないような仕組みらしい。Androidでビルドしたら広告が表示されていたので、これは問題ないのだと思う。参考URLにあるが、iOSでは広告なしでリリースして、後から広告を実装すればいいようだ。
あと、実機で広告が出なかった場合の別の原因として、単純にスクリプトの書き方がまずかった可能性もある。こちらも参考URLに載せておいたが、広告がロード完了してからイベントハンドラを使って広告を表示するようにしないといけないようだ。

【参考URL】
・Admobに関する情報
https://unitamago.com/2021/12/28/xcode%E3%83%BBunity-admobplug-in-ビルドエラーとcocoapods更新/

https://qiita.com/nekojoker/items/231273c8422a88485b27

https://note.com/hanedask0523/n/n92fe260041ad

・Google AdMobの7.3.0を使うとXCodeでビルドできた
https://groups.google.com/g/google-admob-ads-sdk/c/ojN0apGskQs?pli=1

・iOSのアプリは広告が未リリースアプリだと表示されない?!
https://www.hanachiru-blog.com/entry/2021/02/01/120000

・実機だと広告が出ない場合。取得が完了していない可能性あり
https://note.com/08_14/n/nf68b3985784e
https://qiita.com/skuralll/items/19301b86690282df02bf

unityroom1週間ゲームジャム「Re」に参加してみた!!

あまり開発の時間は無かったのですが、アイデアだけは以前から1つあったので、ちょっと頑張って作ってみました!

以下のunityroomで無料でプレイできます。
https://unityroom.com/games/revolverwitches

アイデアと言っても、すごく漠然としていて、「UnityのRigidbodyを使って、速度を維持したまま、上下左右に移動させたり、速度を維持したまま瞬間移動させたりすると面白いんじゃないか」という程度のものでした。
そうして、とりあえず作ってみたものの、初めはシューティングゲームっぽく沢山の敵を殲滅させて爽快感を出すことを考えていたのですが、思ったほど爽快感が無く、シンプルなインベーダーゲームみたいになってしまって、ゲーム性を変えることにしました。結局、パズル要素というか、「どこから弾丸を発射すると敵を殲滅できるか」という、考えさせるゲームにしてみました。

プレイ動画は以下のYoutubeで見れます。
Revolver Witches テスト版

作ってみて、弾丸の速度がゆっくりと落ちていくのですが、止まる寸前で最後の敵1体を撃破できるようにしてみたところ、意外に「あは体験」みたいな爽快感があるような気がしましたw
そして、作ってみて気づいたのですが、このゲームはステージを作る側からすると、結構簡単に問題を作ることができてしまうということです!発射する位置を決めて、あとは反射する矢印を適当に配置して、敵も適当に配置して、あとはうまくいくように調整すると好きな難易度で問題を作ることができます。逆に問題は、「作ってみて実際に難易度が自分でわからない」ということですね。答えを知ってしまっているので、全く初見でこのステージはどれくらいの難易度なのかがよくわらかないのです。unityroomでのコメントにもありましたが、恐らくちょっと難易度が高くなってしまっていた気がします。

縦長の画面から分かるように、今後はAndroidとiOSでゲームを配信したいと考えています。とりあえずまずはunityroomでα版を作ってみた感じでした。

いきなりUnityでAndroidのプラットフォームでビルドが出来なくなった!!

バージョン「Unity2020.3.2f1」を使っていたのだが、今まで普通にAndroidでビルドしてapkファイルを生成できていたのに、いきなりできなくなった!!
特に何もしていないのに。
エラーとしては以下のようなエラーだった。

Gradle build failed. See the Console for details.
つまり、詳細はコンソールを見ろとのことなので見てみた。
うむ。全くわからん!!
とにかくわからないので、空のプロジェクトを作って、Androidでビルドしたら、やはり上と同じエラーが出てビルドが出来なかった。
つまり、プロジェクトの中身は関係なく、Unityがビルドできなくなっていることが判明。
そして、試しに、別のUnityバージョンでビルドしたら、ビルドできた!!
つまり、「Unity2020.3.2f1」のバージョンでだけAndroidでのビルドが出来なくなっているっぽいのだ!!

■対処法
もう何が原因か分からないので、とりあえず近いバージョンということで、「Unity2020.3.4f1」にプロジェクトを変更して、このバージョンでビルドしたらできた!!
結局原因はわからないままだが、バージョン変えて動いたので深く考えないことにした。

Meta Quest2用のUnityのVRゲームを開発できる環境を作るまでにつまづいた点

基本的に、以下の環境を構築すると開発できるようになった。
①まずは以下のURLを参考にQuest2へapkファイルを転送できるようにする。
https://www.code-mogu.com/2020/12/11/oculus-quest2-unity/ ②次に、以下のURLを参考にUnityのVRテンプレートのプロジェクトをビルドしてapkファイルをQuest2へ転送して動くことを確認する。
https://sheltie-garage.xyz/tech/2022/05/unity-vr%E3%81%A7htc-vive%E3%80%81oculus-quest2%E4%B8%A1%E5%AF%BE%E5%BF%9C%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B/

手順通りにやればできたのだが、色々分かりにくいところがあってつまづいたので、以下にメモしておいた。
■コマンドプロンプトでADBコマンドを使えるようにできなかった
 この原因として、私の凡ミスだったのだが、環境変数をWindowsのシステム設定で変更するのだが、Pathのところに追加したはずが、なぜか消えていた。(おそらく確定できていなかったのだろう。)ちゃんとPathに入っていたら、ADBコマンドが使えるようになった。

■Oculus Quest2を開発者モードにする
 Oculusアプリをインストールして、左上の「設定」タブ→「一般」タブを選択して、「開発元不明」をONにする必要がある。ここがなかなか見つけられなかった。
開発元不明のON
■ヘッドセット側も開発者モードの設定をしなくてはいけない
 この設定は、スマホで「Meta Quest」アプリをインストールして、このアプリ内でQuest2を認識させてから、その「デバイスの管理」→「ヘッドセットの設定」→「開発者モード」を選択することでONできる。つまり、スマホで設定しないといけない。

■SideQuestは「Advanced Installer」を選択
 Easy InstallerとAdvanced Installerがあるようだが、Advanced Installerのほうがわかりやすかった。多分Easyのほうでもいいのかもしれないが、よく使い方が分からなかった。
ダウンロードページ
■Quest2用のVRのプロジェクトにはどのテンプレートやSDKを使えばいいのかわからなかった。
 以下の3種類がぱっと思いつく。
 ①SteamVR Plugin
 
SteamVR Plugin
 ②Oculus Integration
 

 ③UnityのVR テンプレート 
 
UnityのVRテンプレート
全て試したわけではないが、開発していくのであれば、③のUnityのVRテンプレートがいいのではないかと思った。
①のSteamVR PluginはWindowsPC内でVRゲームを作るのであればいいと思うが、apkファイルにしてQuest2に入れてもVRとして動かなかったので、Quest2のスタンドアロン型VRゲームができないのではないかと思う。
②は試していないのでわからない。(何となくVIVEとQuest2の両対応できそうな気がする)
③は両対応ができることを確認した。

■Window用であればプラットフォームをPCでビルド、Quest用であればAndroidでビルド
 これは当然だが念のため。

■SteamVR Pluginで開発する場合は、SteamVRを起動させないといけない。
 Unityプロジェクトを再生すると勝手に起動するかもしれないが念のため。
 
SteamVR 起動中
■UnityのVRテンプレートで開発する場合は、SteamVRは不要なようだ。
 UnityのVRテンプレートを動かしたときはSteamVRは起動していなかったので、SteamVRを経由していないようだった。

■開発中にQuest2を使って動作確認する場合
 まず、Quest2とPCをUSBケーブルで接続する。(同一LAN内ならOculus Air Linkでもいけるのかも)
 Quest2内で「Oculus Link」(もしくはOculus Air Link)を起動して、PCとQuest2をリンクしておかないといけない。

とりあえず、開発の準備はできた感じ!!
 

Unity Asset StoreでEasy Saveを買ってみたぁ!!

Unity Asset StoreでBLACK FRIDAYをやっていたので、思わず前から気になっていたEasy Saveを買ってしまった!
Easy Save

とりあえず、便利らしいのでまずは使い方を学んでいきたい!!
使い方を学ぶために備忘録的にこのブログでまとめておこうかなぁ。

ちなみにBLACK FRIDAYのセールはまだやっているみたいなので、便利なアセットを安く買えるチャンスかもしれません!
https://assetstore.unity.com/?locale=ja-JP

Unityをコマンドラインでビルドするためのバッチファイルの内容を忘れないようにメモ!!

いつも、Unityをコマンドラインでビルドする方法を忘れてしまうので、備忘録的にメモしておいた!!
つまり、バッチファイルから、エディタ拡張スクリプト内の「Build()」関数を呼び出している感じです。

ビルドのプラットフォームは「WebGL」にしています。

バッチファイル側(autobuild.batファイル)
rem このバッチファイルの相対パスへ移動
pushd "%~dp0"

"C:\Program Files\Unity\Hub\Editor\2019.4.16f1\Editor\Unity.exe" ^
-batchmode -quit -logFile log.txt ^
-buildTarget WebGL ^
-projectPath UnityProject ^
-executeMethod CommandLineFunc.Build ^
-outputPath WebBuild ^
rem -development

rem このバッチの相対パスから撤収
popd
Unityプロジェクト内のエディタ拡張のスクリプト内(CommandLineFunc.cs)
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using System.IO;
using System;

public class CommandLineFunc
{
    /// <summary>
    /// ビルド実行
    /// </summary>
    public static void Build()
    {
        var output = "";
        bool isDevelopment = false;
        var args = System.Environment.GetCommandLineArgs();
        for (int i = 0; i < args.Length; i++)
        {
            switch (args[i])
            {
                case "-outputPath":
                    output = args[i + 1];   //出力先の設定
                    break;
                case "-development":
                    isDevelopment = true;   //Developmentビルドにする
                    break;
                default:
                    break;
            }
        }

        var option = new BuildPlayerOptions();
        option.locationPathName = output;
        if(isDevelopment)
        {
            //optionsはビットフラグなので、|で追加していくことができる
            option.options = BuildOptions.Development | BuildOptions.AllowDebugging;
        }
        option.target = BuildTarget.WebGL; //ビルドターゲットを設定. 今回はWebGL
        var result = BuildPipeline.BuildPlayer(option);
        if(result.summary.result == UnityEditor.Build.Reporting.BuildResult.Succeeded)
        {
            // ビルド成功処理
        }
        else
        {
            // ビルド失敗処理
        }
    }
}

Unityの新たな利用法として、イラストに使ってみた!!

先日、邪神ちゃんドロップキックイラストコンテスト3というイベントがあり、そこへ投稿するイラストを描いてみました!

ストリートファイターVが好きなので、ゆりねのアパートの前を舞台としたストV風のバトルシーンを描きたいと思ったのですが、とても背景まで描きこむスキルもないので、今回は新たな試みとして、Unityを使って背景を3Dモデルで表現することにしました。キャラクターやストVのUI的なものは、イラストとしてUnity内で取り込み、背景を3DモデルとしてUnity内で3D空間内に配置しています。
ちなみに、3DモデルはBlenderで制作していますが、それほど複雑な形状は無かったので、イラストを描くよりは格段に速く作ることができました。

結果として、意外にイラストと自然にマッチしていてよかったです!!
今後も何かイラスト作成する機会があったら使ってみたいと思います。

以下のイラストは、キャラクター部分を除いたUnityの制作画面です。
上がシーンビューで、下が出力用のゲームビューです。
Unityでイラスト制作

UnityのStandard Assets内にあるスクリプト内で自作したスクリプトの変数が読み込めない原因がわかった!!

てゆーか今まで知らなかったのがまずかったのだが、「Standard Assets」フォルダは特別がフォルダらしく、いわゆる「Resouces」フォルダや「Editor」フォルダみたいな感じの扱いらしい。そして、「Standard Assets」フォルダ内にあるスクリプトは、自作したスクリプトよりも先にコンパイルされるらしく、そうすると、「Standard Assets」フォルダ内にあるスクリプトを編集して、自作したスクリプトの変数などを参照した場合は、コンパイル順が早いため、自作したスクリプトの変数がまだ存在しないからエラーになってしまっていたようだ。

私は、「FirstPersonCharactor」と「ThirdPersonCharactor」のプレハブを使いたかったので、これらのプレハブで使われていたスクリプトを編集したかったのだが、今までこのエラーの原因が分からずにずっと諦めていました。。。
結局、対策としては、「Standard Assets」というフォルダ名にしなければいいわけなので、何か適当な「Standard Assets Test」などのように別のフォルダに変更してあげるだけでよかった!!

アバターを一から作成してみての手順をまとめてみた!!

とりあえず、備忘録的に手順だけまとめてみました。
一つ一つの作業が重かったので、結局全て完成するまで多分500時間くらいかかった気がする(;´Д`)
モデラーの方のすごさを身に染みて感じることができたぁ!!
ちなみに、Virtual Marketに出展するように作ったので、VRChatに関する作業も中に入っています。

【手順】
⓪下絵を描く
①モデルのポリゴン作成 (左右対称ミラーで作ること!!)
  ・作成手順は以下
    頭
    体
    手
    目とまつげ
    髪
    ケモ耳としっぽ
    服
    靴と装飾
    口の中
②ボーン作成
③ウェイトペイント
④VRChatでアバター動作確認
⑤UV展開
⑥テクスチャ作成
⑦シェイプキー作成
⑧ダイナミックボーン設定(もし付ける場合)
⓽アニメーションオーバーライドで表情を割り当て(VRC Avatar Discripter)
⑩クロス設定(もし付ける場合)
⑪アバターをBOOTHで配布準備
⑫VRM対応(必要ならば)
© 2025 Husky Studios, All rights reserved.