Godot+R3のマウス操作

動作確認をして学習している。

せっかく学んだことをそのままにしておくと忘れるのでメモ。


using R3;
Observable.EveryUpdate()
	  .Where(_ =>Input.IsActionPressed("click_DOWN"))
            .Subscribe(_ => GD.Print("GetMouseButtonDown"))
            .AddTo(this);

click_DOWNの部分は、任意で設定したもの。
「プロジェクト>インプットマップ」で作れる(下)

click_DOWNという文字列はおかしいとは思うが、テストでやっているのでご愛嬌。

作りたいゲームがあればどういう機能が必要なのかを考えて、1つずつテストしていく。

頭の中で分からないことがなくなれば実際に作り出せばいい。

今の時点ではよく分からないことが多いので、検索したりAIに聞いたりしてまとめている。

(結構楽しい☺️)

unity改め、Godot でR3を使う

unityのuitoolkitを使おうと思ったがなかなか渋いなあと思って沼っていた。

ネットにある情報は片っ端から見たしマニュアルもみたが「う〜む」という感じ。

なんだか一生懸命学んだところで、大儲けしたら利用料を取られるのも厳しい。

そもそもアマチュアだし、作りたいのは2Dだし、これから一生ゲーム開発をするなら経費は抑えたい。

ということで昨日からGodotを学び始めた。

いろいろ学習してきたがR3(unirx)も使えるということで環境を整えようとしたがエラーが出たので、記事にしておく。

ちなみに今現在、X(旧ツイッター)で調べてみたところ誰もポストしていない情報である。

環境は、mac m4 pro godot v4.3である。


基本的な流れはこちらであっている。

https://qiita.com/dogenzacker/items/6486c4bc1fc0df837a2e

しかし、私が試したところ、C#12を使っていないというところでエラーが出た。

ChatGPTにきいてみたところ、「XXXX.csprojファイル」でC#12とnet9.0を使うように設定しなければならない。

<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<LangVersion>12.0</LangVersion>

<PropertyGroup>にこの2つを追加するとR3は一応動くようになった。


これで動くかと思いきやまだエラーがでた。

    public void NotifyOnSessionStart()
    {
//ここから
          if (debuggerPlugin == null)
        {
           //GD.PrintErr("debuggerPlugin is null in NotifyOnSessionStart"); //デバック用。コメントアウト
            return;
        }
//ここまで追加
        debuggerPlugin!.SetEnableStates(sessionId, enableTracking, enableStackTrace);
    }

これまたChatGPTにきいたら、このコードを教えてくれて追加したらエラーは止まった。

(どうやらdebuggerPluginという変数にnullが入ってるらしい)

そして、R3のプログラムを書いてしっかり動いているようだった。

ということで、一応「godotでR3は使える」ということを確認した。

ChatGPTすげえ! (なんでも教えてくれる)

Visual Studio CodeのアクティビティバーにGitHub Copilot Chatのアイコンを表示させる

有料だったので、あまりGitHub Copilot には興味はなかったのだが、無料になったということで早速インストールしてみた。

***

インストールは簡単に終わったものの、アイコンが出ない。

それ以外の機能は使えている。

githubにログインもできている。

おかしい。

・・・。

謎にアイコンが表示されないので30分ぐらい悩んだ結果、出すことに成功したので、やり方をシェア。

ずっとこんな状態だった。(上)

ショートカットキーで一応チャットは開けるし動作も確認できている。
しかし、使い方を教えてくれているwebサイトにはアイコンが表示されているので私も表示したい。

解決

上の画像は、ショートカットキーなどでGitHub Copilot Chatを開いたときの上段メニューである。

ここにチャットのアイコンがあったので、これをドラックしてアクティビティバーに移動したらアイコンが移動できた。

終わり。

(ポエム)ゲーム開発は今でも難しい

ゲーム開発の道のりは、単純に見えて実は非常に複雑です。ゲームを完成させるためには、1から10までの全ての作業が必要ですが、書籍やネットの情報、さらには生成AIを使っても、初期段階で得られるのはせいぜい1から3程度の知識にとどまります。まるで、絵を描く方法は教えてくれるけれど、漫画のストーリー作りを教えてくれないようなものです。

重要なのは、ゲームをしっかり完成させ、最終的にお金に変換することです。そのためには、途中で得た部分的な知識だけでは足りません。どれだけ情報を集めても、最終的に求められるのは、5から10までの道のりを自力で進む力です。これらのステップは、誰かに教わったりAIに頼ったりするだけでは乗り越えられません。

たとえば、プログラムコードに関しては、生成AIを使えば100行程度のコードはすぐに書いてくれるでしょう。しかし、ゲームが中規模に成長し、コード量が3000行を超えると、もう生成AIに頼るだけでは難しくなります。5000行から1万行規模のコードを書く場合、AIが1000行程度手助けしてくれたとしても、残りの部分は結局自力で解決しなければなりません。さらに、AIが書いたコードをそのままコピー&ペーストして使おうとしても、十分に理解せずに進めると、ゲームを完成させることはほぼ不可能です。

プログラムの世界では、ほんの1文字の誤りがエラーを引き起こすことが多く、期待通りに動作しない場合には詰んでしまうこともあります。だからこそ、ゲーム開発は今でも非常に難しいと感じます。

逆に言えば、100行程度のコードで完成するような超シンプルなゲームなら、無限に作ることができるでしょう。複雑なゲームを作り上げるためには、時間と努力を惜しまず、細かな部分までしっかりと理解し、調整し続ける覚悟が必要です。


ChatGPTを使って文章を書かせた。

毎日、ゲーム開発をしているがだんだんとAIが通用しなくなってきた。(1000行超えてきたかな?)

部分的には頼りになるが全体的なバランスなんかはどうしても個人の力が必要になってくる。

そもそも一部でも理解せず、コピペで終わらせようとするものなら、そのコードが後々になってバグを生み出す。生成AIを使ってコードを書くのは良いのだが、しっかり理解してから次に進まないと最終的にゲームは完成せず、リリースもできず、スパゲティコードとなり、全てが破綻するだろう。

ということで、1日ガリガリコードを書いたら、次の日はただコードを見直すという時間を作った方がいいだろうと思う。

(超基本)他のゲームオブジェクトにアタッチしているスクリプトの変数を外部から変更する方法

XXX_SCRIPT game_obj = GameObject.Find("MOTO_GameObject").GetComponent<XXX_SCRIPT>();
game_obj.functionX(); //雰囲気こんな感じか

//Find系は、AwakeやStartで1回だけやらないと負荷がかかるので注意。

unityを触るのが久しぶりすぎて超基本的なことを忘れていた。

「なんか変だなあ」と思いながら結構ゲーム自体は作れてしまったので不思議。

現在は、全てGetComponentに置き換えて、基本的に1つのゲームオブジェクトには1つのスクリプト。あるいは関連するスクリプトしかないようにしている。外部からどうしても変更したい場合は、GetComponentで取得して変更するとうまくいった。

誤ち

別のゲームオブジェクトを複数画面に表示させて、同じスクリプトをアタッチしていたところ、謎の状態となってしまった。
(AwakeでDebug.Logを書いたら同じログが3回も表示していた)

正解

基本的にスクリプトは1つだけアタッチさせて、外部からGetComponentでアクセスしていじる。

この記事の1番の上に書いたように、「GetComponent<XXX_SCRIPT>();」で探して利用すると良い。

いろいろなゲームオブジェクトにアタッチしておくと全て初期化されるので(だよね?)、データの更新など意味がなくなる。staticやらシングルトンにすると良いと思うがそれは基本的にやらない方がいい。

結局1本ゲームを作るとなると1から全て学ぶ必要があるんだよね。

滑らかにオブジェクトを移動させるには?

float fallSpeed = 1.0f;
gameObject.transform.Translate(Vector2.down * fallSpeed * Time.deltaTime);

テトリスのようなゲームでオブジェクトを自然に落下させるにはこんな感じにすると良い。

1マスずつずらしていくとなんかカクカクした感じになるのが個人的に苦手なんでね。

Observable.EveryUpdate()
.Subscribe(_ => Down_Block());

R3も使って、Updateをする感じも忘れずに。

いろいろ試してみたけどGeminiが教えてくれた。

ミソは、「fallSpeed * Time.deltaTime」これ。

すーっとオブジェクトが移動するのがなんとも気持ちいい。

美しいコードを書くには見直し&管理時間の確保が早い

美しいコードを書きたいとは思うもののいつの間にかごちゃごちゃしてくる。

これを解決するために、リファクタリングとかいろいろ知識を得ているわけだが、最初からリファクタリングなんかできるはずもなく、とりあえず汚いコードでもいいから全力で書く。

そして、思い通りの動作が確認できたら一旦冷静になってコードを見直す。

クラス分けができそうならするし、インデントなんかもする。コメントも不要なものは消す。

そうやって一旦動いたものを見直す時間があれば、結果的に美しいものになっていくんじゃないかという話。絵を描くにしても最初から実線は引かないわけで鉛筆で下書きとかする。それに近いのかな。

R3 ダブルクリック

unirxではなくR3を使うのでメモ

using R3;
var DoubleClickStream = 
            Observable
                .EveryUpdate()
                .Where(_ => Input.GetMouseButtonDown(0))
                .TimeInterval()
                .Select(t => t.Interval.TotalMilliseconds)
                .Chunk(2, 1)
                .Where(list => list[0] >  250d)
                .Where(list => list[1] <= 250d)
                .Subscribe(_ => { Debug.Log("double click");
                //ここに関数を書いたりしてテストに使える
                
                 });

引用元はこちら 下

using UnityEngine.Poolな件

早速、ゲーム開発をしている。

今回はusing UnityEngine.Poolの話をする。

ブログ自体のタイトルにしているが「Unity6」でやっている。(次からの記事はわざわざ書かないようにしたい)

とりあえずコード

// プールを新規作成

var newPool = new ObjectPool<GameObject>(
 createFunc: () => Instantiate(prefab),
 actionOnGet: obj => obj.SetActive(true),
 actionOnRelease: obj => obj.SetActive(false),
 actionOnDestroy: obj => Destroy(obj),
 maxSize: maxSize
);

メインとなるのはこのコード。

無名関数を使うととてもシンプルになる。

公式に書いてあるのだが、

https://docs.unity3d.com/ja/2021.2/ScriptReference/Pool.ObjectPool_1.html

GETとReleaseが標準publicで定義しているので、そのまま呼び出せる。

上のコードは私が四苦八苦検索して調べたものではなく、ChatGPTが書いたもの。

実際自分でビルドして思った通りの動作になればOKというスタイルだ。

他にも、シングルトンにする方法もChatGPTが教えてくれて実際のコードにはシングルトンで書いている。

あまり記事が長くなると書く私も読む方もしんどいので、ここで終わりにする。

言いたいことまとめ

1、ChatGPTが便利

2、オブジェクトプールは使うべき

3、マニュアルを読め

4、unirxではなくR3を使い出していてオブジェクトプールがないらしい

以上

ゲーム開発と企画の話

ゲームを1本作ることにした。

その理由を書いておく。

  • ChatGPTの存在
  • M4mac
  • ウルトラワイドモニター
  • 作りたいものがあった
  • 暇だった

ChatGPTを触ってから1年ぐらい経過した。初期の頃は使い物にならないかなと思って放置していたが2024年になってから使えそうだということがわかってきたので使おうと思った。

そして、プログラミングをやらせてみると私が分からなかったことをスイスイ教えてくれた。

ということで、ChatGPTというパートナーを使ってゲームを作れるのかもしれないという可能性がでてきた。アイデアは常にあったのだが形にするのが面倒だと思っていたが手伝ってくれるのであればコスパが良い。

お試しでミニゲームを1本作ったら作れてしまった。(3時間ほどで)

https://deleteblock.httqs.com

こりゃ本格的にunityで作ってもいいかもしれないということでテンションが上がった。

ちょうどM4macが発売されるということで買った。

mac mini m4 proで34万円ぐらいした。それに加えてDELLでウルトラワイドモニターも購入した。こちらは13万円ほど。

この2つとChatGPTを使いゲームを作ろうと思う。
過去にunityでゲームを作ったことがあるが重たくてしんどかった。
最新のmacなら高速でビルドされるはずだからストレスもない。

ウルトラワイドモニターなら動画を見ながら作業もできるのも良い点だ。

つまり、開発環境が整ったことがゲームを作るきっかけとなった。

アイデア

ゲームのアイデアは私が過去に遊んできたゲームで面白いシステムや好きなシステムを組み合わせてみようと思った。例えばシャドウバースの2picみたいなものとかね。どちらかを選ぶと片方は選べなくなるというのはゲームとして面白かった。基本的にカードゲームとローグライクとパズルゲーム、(将棋と麻雀)が好きなのでこれの組み合わせたローグライトのようなゲームになる(すでにノートにゲーム画面は書いてある)

詳しいアイデアを書くと万が一にも盗まれるのが嫌なので、詳細は書かないのだが、過去に自分が遊んで面白かったと思ったことをつなぎあわせてゲームを作っていますよということだけはお伝えしたい。