プラグイン集

無料ブログはココログ
2021年8月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

サンプルJS

  • ユーロバカ一代の締切
    ・・・初期化中・・・

« 2020年7月 | トップページ | 2020年10月 »

2020年8月

2020年8月16日 (日)

電車でD ShiningStage の MOD 作りは可能かの調査

電車でD RisingStage までは、Selene というゲームエンジンで、Win32 のコテコテのバイナリで電車でDのゲームは作られていた。
x86 アセンブラの知識があれば、MOD 作りは可能だろうが、そんなものはないので諦めていた。

電車でD ShiningStage になってからゲームエンジンが Unity に変わったおかげで、x86 アセンブラの知識がなくても、
C# の知識レベルで対応できるようになった。

参考サイト:https://github.com/yaegaki/unity-mod-doc 
ほかにもいくつかサイトを見たが、URLを忘れた。
まぁ、調べたい人は調べがつくし、勉強する気がない人はたどり着けないので、省略でよいか。

道具:Visual Studio 2019Unity 2018.4.6f1JustDecompileILSpy.exeReflexil電車でD ShiningStage DEMO2(OPだけがループする奴。)

それぞれのインストール方法については省略する。ILspy にILコンパイラを追加する方法は、Reflexil のサイトからダウンロードした一式をコピペで置くだけ。

参考サイトには、”Visual Studioでクラスライブラリを作成します。 ”とさっくり書いてあるが、自分のインストール設定の Visual Studio 2019では、C# のクラスライブラリは、クラスライブラリ(.NET Standard)、クラスライブラリ(.NET Core)、クラスライブラリ(.NET Framework)、クラスライブラリ(ユニバーサルWindows)の4つがある。いったいどれだよ。
クラスライブラリ(.NET Framework)が正解らしい。ソリューションの設定を、電車でD ShiningStage が持っている、Assembly-CSharp.dll に合わせて、.NET Framework 4.X に設定する。

これでプロジェクトを開くことができる。
Assembly-CSharp.dllと同じフォルダに存在する UnityEngine.dll を開いて、参考サイトのコードをコピペ・・・、はい上手くいきません。
赤線が引かれて駄目です。MonoBehaviour は、UnityEngine.CoreModule.dll を参照に追加することで有効になる。
GUI.TextArea は、UnityEngine.IMGUIModule.dll を参照に追加することで有効になる。

これで、dllの準備が整い、赤線が消えるので、クラスライブラリ設定対象フレームワーク設定が.NET Framework 4に設定されていることを確認する。そしてコンパイルする。無事にプロジェクトディレクトリのdebugディレクトリにClassLibrary1.dllが作られる。

ClassLibrary1.dllのInitを電車でDのいっぱいあるクラスのどこで呼んでもらうかだが、cGameMgrクラスのtoOP()の最初にエントリー(Init)を仕掛けて、cGameMgrクラスの toMenu()とMenuToOP()でonDestory()を仕掛けた。

さっそく、Assembly-CSharp.dll を再度アセンブリしたいところだが、JustDecompile は依存ライブラリ UnityEngine.CoreModule.dll が解決できないとエラーを出力してフリーズするし、ILSpy は別のフォルダーに保存することで行けた。
dnSpy 使えばといわれそうなので書いておくが、JustDecompile と同じ運命をたどった。
dotPeek は・・・、存在忘れてて SSD の肥やしになってた。まぁ、ILSpy.exe+Reflexilで行けたからOK。
作ったソースは、以下の通り。

using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Text;
using UnityEngine;

namespace Benchss1

{
public class BenchMark1 : MonoBehaviour
{
// variables
long allframs = 0;
float myfps = 0.0f;
GUIStyle m_guiStyle;
GUIStyleState m_styleState;
//private static Boolean created = false;
static GameObject go = null;

public static void Init()
{
go = new GameObject();
//DontDestroyOnLoad(go.gameObject);
go.AddComponent();

}

void Start()
{
allframs = 0;
myfps = 0.0f;
m_guiStyle = new GUIStyle();
m_guiStyle.fontSize = 40;
m_styleState = new GUIStyleState();
m_styleState.textColor = Color.green;
m_guiStyle.normal = m_styleState;
}
void OnGUI()
{
allframs++;
//float time = Time.realtimeSinceStartup - prevTime;
myfps = 1f / Time.deltaTime;

String myrenderedframes = "Score : " + allframs.ToString() + " \nFPS : " + myfps.ToString("F3");
GUI.TextArea(new Rect(40, 40, 500, 300), myrenderedframes, m_guiStyle);
if (Input.GetKey(KeyCode.R))
{
allframs = 0;
}
}

public static void OnDestroy() {
Destroy(go.gameObject);
}
}
}

C# なんて知らず、Visual Basic の自分からすれば、よく書いたわ。
前に Unity 使った時は、UnityScript(JScript(javaScriptとは似て非なるもの))で作ってたので、参考にならない。

本当は、電車でD ShiningStage のOPのシーンが最初に戻るたびにスコアをリセットしたいところだが、キーボードのRキーを押してリセットで妥協した。

このノートPCでスコア9000ぐらい行くので、20000 以上が動作ラインじゃないか?
アルゴリズム見ると分かるが、ただレンダリングしたフレーム数を足しているだけなのだが、
2分*60秒*60フレーム=7200フレームのはずなのだが、橋を渡るシーンなどで数秒間に400fps越えするので、2000フレーム位上振れしている。
しかも、スコアは64bit整数だが、適度にリセットしないとオーバーフローする。

MODとしては稚拙な出来だが、電車でD ShiningStage の MOD が作れるかどうかに十分答えられると思う。

本当はもっと、FFベンチとかドラクエベンチみたいに、「貴方のマシンは、やや性能不足です。」とかスコアをもって判定できればよかったのだが、残念ながらそこまでのコーディング能力はなかった。(やっぱり実ソフト動かして、良い悪い言う方が、スペック情報取って判定している電DローダーSSより、説得力がある。)

これを積み重ねていくことで、BGM差し替えや自分の車両の追加、オリジナルシナリオ追加、オンラインプレイ環境整備とMODの幅を広げていけるだろう。

配布は・・・、Assembly-CSharp.dllとClassLibrary1.dllを電車でD ShiningStage DEMO2のdend_ss_demo2\DenD5_Demo_Data\Managed\ フォルダーに上書きコピーすれば適応できるが・・・、セキュリティソフトが通さないので、配布しない方がいいだろう。

これだけ大規模な構造体(プログラムの意味じゃなくて、コンポーネント接続図的な意味で。)をしっかり把握している地主さんはすごいな。
そしてオーディオ関係のかなりのコード量。Twitterでちょくちょく言っていた通り、相当な問題児だったことがうかがえる。

« 2020年7月 | トップページ | 2020年10月 »