投稿記事

いらにか 2023/10/06 10:56

【雑記】Unityの代替として話題になりつつあるGodotを触ってみた【ゲーム開発】

発端

最近、Unityがライセンス変更の色々で燃えていたりしたニュースで移行先としてGodot(ゴドー)が上がっていた。
別件だが、CySharpの人のツイートでGodotというゲームエンジンがC#の対応がいい感じだという話も見かけた。
Microsoft公式のゲーム開発のオススメエンジンリストに乗っていたので、Godotの名前だけは知っていた。

そんなわけで、周りでGodotの名前をよく見かけるようになったので、ちょっくら触ってみるかと思った。

Godotのチュートリアルをやった感想

公式の2Dゲームを作るチュートリアルをやってみた。
https://docs.godotengine.org/en/stable/getting_started/first_2d_game/index.html


https://x.com/happy_packet/status/1706650948096217167?s=20


学習のためにスローペースで進めたが、大体3時間くらいで終わった。
ゲームエンジンが大体どういう存在かを過去にUnityで学んでいたので、すんなり理解できた。
独自スクリプトのGDScriptはPythonみたいなものなのでノリで書けた。
ただチュートリアルで移動イベントのベロシティ操作(移動の座標処理)のこのコード。

func _process(delta):
    var velocity = Vector2.ZERO # The player's movement vector.
    if Input.is_action_pressed("move_right"):
        velocity.x += 1
    if Input.is_action_pressed("move_left"):
        velocity.x -= 1
    if Input.is_action_pressed("move_down"):
        velocity.y += 1
    if Input.is_action_pressed("move_up"):
        velocity.y -= 1

    if velocity.length() > 0:
        velocity = velocity.normalized() * speed
        $AnimatedSprite2D.play()
    else:
        $AnimatedSprite2D.stop()

これは三項演算子的な書き方にしたほうが良いよと思った。
※まぁPythonの三項演算子もどきが見やすいかどうかは賛否あるが。

func _process(delta):
	var velocity = Vector2.ZERO
	velocity.x += 1 if Input.is_action_pressed("move_right") else 0
	velocity.x += -1 if Input.is_action_pressed("move_left") else 0
	velocity.y += 1 if Input.is_action_pressed("move_down") else 0
	velocity.y += -1 if Input.is_action_pressed("move_up") else 0
	
	if velocity.length() > 0:
		velocity = velocity.normalized() * speed
		$AnimatedSprite2D.play()
	else:
		$AnimatedSprite2D.stop()

一通り触ってみて感触は良かったが、円のシェイプが4.0では未実装だったり、イチからゲームを設計して作ろうと思ったときに欲しい物がまだ足りてないなと思った。
とは言え、欲しい物がなくても代替手段はあるのでどうにかできる。
未実装の部品が実装されていけば、開発がもっと楽々になりそう。

なにか作ってみたいよね

https://x.com/happy_packet/status/1708836776209698890?s=20

年末とかに時間とれたら、えっちなブロック崩しとか、脱衣ジャンケンゲームとか作ってみたい。
(プログラムよりは素材作りで時間が溶けそう)

余談

https://x.com/reduzio/status/1706984046784401784?s=20


機械翻訳
`
この図は、Godot 4 GDExtension システムがどのように動作するかを示しています。

Godot 4 の C# は現在、古い Godot 3 専用の Mono グルー バインダーを使用しています。

C# を GDExtension に移行すると、コア エンジンで Glue/Mono バインディングが不要になり、エンジンの統合が可能になります。
`

コアエンジンがMono依存から抜け出すことで、Monoに縛られていたC#も自由になるっぽいです。
UnityであったようなMono縛りから開放されると、ライブラリの選択肢も増える上にランタイム固有のバグが減るはずなので結構メリットがあります。
まだまだ発展途中っぽいですが、この変更はすごく好感があります。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

いらにか 2023/09/03 19:25

【公式実装してくれ】DLsiteの作品ページから直接ギフトページを開く【ブックマークレット】

DLsiteで簡単にギフトページを開く

知ってる人も多いだろうが、DLsiteは作品をギフトとして他人にプレゼントすることができる。
一般書籍を扱うComipoフロアも同様なので、つまるところ一般書籍を他人にギフトでプレゼントできる。
つまり、推してる漫画とかを一方的に送り付けて布教できる!






※推してる漫画の一部



ただ、このギフト購入ページは作品ページから直接開けず、購入履歴から開く必要があるめんどくさい仕様になっている。





で、過去にDLsiteの作品ページからギフトページを直接開くブックマークレットを作っていたのを思い出した。
随分と前のことなので自作ブックマークレットまとめのBookmarkletBoxにも記載するのを忘れていた。




というわけで、記載しておいたので使いたい人はご自由にどうぞ。

https://iranika.github.io/bookmarklet/#_opengift


DLsite Dark2に組み込んでしまう

ぶっちゃけ作品評価のリンクの下とかに、ギフトページへのアクセスボタンを組み込んだほうが直感的で便利だと思う。
なのでChrome拡張機能のDLsite Dark2に試験実装してみた。
一応、デフォルトでは無効で拡張機能のオプションページからボタンを表示するように設定できる。
※一般公開への反映はChromeストア審査後に適応されます
 概要にギフトページのことが追記されていたら使えるようになってます


配置とか順序とかはさておき、こんな感じでDLsite公式が実装してくれたらいいなと思った。



余談

サムネの画像は先月遊び先で撮影したゾウガメ。
めっちゃおしりがキュートだったので、狂ったように写真を撮った。

久しぶりにカメラを引っ張り出したが、やはりオリンパスのStyles 1Sは名機だと思う。
サイズと性能がお散歩カメラとして便利すぎて、カバーできるシーンがとても多い。
レンズは全域F2.8の明るさで、フルサイズ換算28mm~300mmの超便利ズーム。
カメラちょっと分かる人向けに言えばポケットに入るサンニッパ。
ポートレートも風景も鳥もめっちゃよく撮れる。ボケ感もいい。

ポケットに入るサイズでこの性能はすごく魅力的なのだが、1/1.7型センサの機種やこのスペック帯の機種は現代だと作られる見込みがほぼ無い。
スマホのカメラがこれらを市場から駆逐してしまった。

ぶっちゃけ、最近のスマホのカメラはすごく性能が良いのでコンデジの市場は競合していてすごく厳しい状況が続いている。
SONYや多くのメーカーがVLOG向けにターゲットを絞って、写真というよりは動画が主戦場になっているし、お散歩カメラは単焦点系の近距離がメインになっている。

Stylus 1Sが壊れたときのために、中古でもう一台買おうかと本気で悩んでいたりする。
まぁそのお金をスマホに回したほうがコスパは良いのだけど。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

いらにか 2023/08/15 21:51

【情報技術】Notionが便利すぎて夜も寝られる話【ツール】

Notionが便利すぎる

6月くらいからNotionというツールを使い始めて、仕事でも趣味でもドキュメンテーションがすごく捗っている。
知らない人向けに簡単に説明すると、NotionはWikiや文書やプロジェクト管理など様々なことに使える近年流行りのイケイケツール。
大企業も使い始めていたりする。



https://www.notion.so/ja-jp/product

機能的にはブログのようなCMSとも言えるし、Wikiとも言えるし、RedmineやBacklogなどのチケットシステムとも言えるし、既存の言葉で説明しようとすると概念が少しブレてしまう気がする。
なので、Notion公式が言うようにコネクテッドワークスペースと呼ぶのがふさわしいかもしれない。


色々と便利なのだが、単純にアイデアノートとして使うだけでも十分に価値がありすぎる。


Notion公式サイトに「ツールと仕事の未来についての物語」というアバウトページがあるのだが、これが非常に共感できる良い記事だった。
時間に余裕がある人はぜひ読んでほしいのだが、現代の私達の仕事はアウトプットの継ぎ接ぎなのだという観点と文章/絵/写真/音声/動画/プログラム/その他の様々な情報の集約と加工によって最終的なアーティファクト(成果物)が生み出されていることに着目して、それらをキチンと一つのワークスペースに集約できるようにNotionが意図して作られている点をぜひとも覚えて帰ってもらいたい。


ちなみに僕は二次創作のアイデアや日々の気づき等のメモ、仕事の企画/計画のプロットなどにNotionを使っている。
※以前はメモにGoogle keepを使っていたが、同期トラブルや表現できない形式があるのでやめてしまった。便利だったけれど。


仕事が捗る

ドキュメントはアウトプットかつ目に見える成果物なので、仕事における引き継ぎやノウハウなどは文書化(ドキュメンテーション)して共有するようにしている。
他人に教える手間が省けるのも助かるが、それ以上にノウハウの詳細を忘れてしまった未来の自分が助かったりしている。
文字の羅列だけだと意図を十分に伝えられないので、グラフやスクショや動画など文字以外の情報も必要に応じて入れ込んだり、少しリッチに作っている。


これまではMarkdown、Word、PowerPointなどでドキュメントを作成していたが地味に書き心地がしっくり来ていなかった。


僕はブログを書くのが好きなので、Ci-enで雑多な記事を書いたりしているのだが、Notionはすごく書きやすいブログみたいな感じで書けるので相性が良くてとても気に入ってしまった。


職場でも個人的に使いたくなって許可を得て使い始めてみてたが、これが本当に捗る。
特に企画書や計画書。
これらは入念に作り込んでも、様々な要因で棄却されたり修正が入って別物になったりするので、正直なところコストをあまりかけたくない代物だと思っている。ただイメージを共有することが目的なら使い捨てる気満々のチープなプレ企画書みたいなもので済ませたりしていた。
Notionはプレ企画書を作るのにちょうどよくて、短時間でさくっと見栄えも悪くない感じの文書を作ってパッと共有できるので非常に助かっている。


余談:小規模な事業者はITシステムどうしてるんだろう話

久しぶりに兄と居酒屋で酒を酌み交わして、そんな感じの話になった。
結局はITに詳しい人がいないとNotionみたいに便利なものがあっても職場に取り入れられずに環境の向上ができない。
かと言ってITコンサルを入れようにも、8人未満くらいの小規模だと費用が割高に感じるし、コンサル側も資金力が弱いと避けたがるので、両者の溝は深まっている気がする。


ITサポートも受けられるような事務系アウトソーシングサービスもあったりするが、ピンキリなので個人的には評価が難しい。
結局のところは、中の人が頑張らないと放置されたままで良くならないのが小規模事業者の現状なのかもしれない。


PCは使いこなせて当然じゃないし、プログラムは書けて当たり前じゃないし、新しいツールに手を出すことは億劫だし、ワークスタイルをデザインできるのも当然じゃない。
僕はこの感覚をもう失ってしまった人間なので、言葉では理解していても実感ができない。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

いらにか 2023/07/22 18:04

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

いらにか 2023/07/19 22:49

【Mes】チャット風テキスト生成について【書き忘れ小話】

まえおき

Mesにはチャットスタイル形式のHTMLを出力する機能があります。
これは現在のシンプルエディタ(SMWE)でもお試し感覚で使えます。

https://smwe.iranika.info/

ボタンを押すと下記のようなテキストがクリップボードにコピーされます。

<span style="color: #8D9147">いら:</span>どうも、いらにかの半身の"いら"です。
<span style="color: #9E09CA">にか:</span>どうも、もう半分の"にか"です。ってこれは一体なんですか?
<span style="color: #8D9147">いら:</span>今回は対談風テキストをブログに書き起こすときに便利なツールを作ってみたので、それの話をしようかなと。
<span style="color: #9E09CA">にか:</span>なるほど。それで実際にこんなテキストを書いてるのですね。
<span style="color: #8D9147">いら:</span>対談風テキストを書くときって大抵"〈名前〉:〈セリフ〉だよね。
<span style="color: #9E09CA">にか:</span>コロン《:》の代わりに余白とかのケースもありますね。
<span style="color: #8D9147">いら:</span>で、大抵のブログってHTML直書き or WYSIWYGって呼ばれる仕組みを採用してるんだけど、
名前のところを色つけたりとかボールド表示したりとか、いちいちブログのエディタで操作するの面倒くさいんだよね。
<span style="color: #9E09CA">にか:</span>あー、以前”よくわかる道草屋”を作ったときにも苦しめられてましたね
※”よくわかる道草屋”は某サービスの評価試験目的で作られたサイト。スマホじゃないとレイアウトが崩れるのであまり紹介したくない黒歴史。
<span style="color: #8D9147">いら:</span>無駄に思える繰り返し作業が本当にストレスなんだよね。
パソコンに出来ることならパソコンにやらせるべきだし。
あと、シエル学園シリーズは対談系テキストも書く予定だから、いっそのことツール作っちゃおうってことで作りました。

これをCi-enにそのまま貼り付けるとこんな感じ。


いら:どうも、いらにかの半身の"いら"です。
にか:どうも、もう半分の"にか"です。ってこれは一体なんですか?
いら:今回は対談風テキストをブログに書き起こすときに便利なツールを作ってみたので、それの話をしようかなと。
にか:なるほど。それで実際にこんなテキストを書いてるのですね。
いら:対談風テキストを書くときって大抵"〈名前〉:〈セリフ〉だよね。
にか:コロン《:》の代わりに余白とかのケースもありますね。
いら:で、大抵のブログってHTML直書き or WYSIWYGって呼ばれる仕組みを採用してるんだけど、
名前のところを色つけたりとかボールド表示したりとか、いちいちブログのエディタで操作するの面倒くさいんだよね。
にか:あー、以前”よくわかる道草屋”を作ったときにも苦しめられてましたね
※”よくわかる道草屋”は某サービスの評価試験目的で作られたサイト。スマホじゃないとレイアウトが崩れるのであまり紹介したくない黒歴史。
いら:無駄に思える繰り返し作業が本当にストレスなんだよね。
パソコンに出来ることならパソコンにやらせるべきだし。
あと、シエル学園シリーズは対談系テキストも書く予定だから、いっそのことツール作っちゃおうってことで作りました。



この機能は「Mesが脚本特化なら、ブログ向けの対談風テキストとか生成できたら便利なのでは?」 という思いつきで作りました。

地味にキャラごとの色分けが自動化されてたり、個人的に頑張った機能なんですが、シンプルエディタだとサンプルがショボいテキスト生成なので、いまいち便利さが伝わらない感もあったりします。

本題

最近、Ci-enにやってきた川上稔氏がキャラアイコン付きの対談形式っぽい感じで記事を投稿していて、「やっぱり対談形式ならではの面白さってあるなぁ」 と改めて思いました。
※カクヨムで無料公開されている境界線上のホライゾン NEXT BOXもアイコン付きだったのを思い出しました
※参考記事 https://ci-en.dlsite.com/creator/17061/article/914079
※注釈:川上稔氏はR18で活動してるので他記事はえっちなやつが多いです。
 我は大人だぞ?という人はフォローしてヨシ!
 未成年は境界線上のホライゾンを今すぐ買えば、読み終わる頃には大人だと思います(ここ笑うとこ)



さてさて。
シンプルエディタのチャットスタイル形式ではアイコンではなく、色付きテキストの生成になっているので何が関係あるんだという感じですが、実はMesライブラリでチャットスタイル生成を担当しているToChatStyleHTMLメソッドは引数でテンプレート関数を渡せば、好きなテンプレートでテキスト生成ができる仕様になっています。


つまり、ライブラリの利用側が独自のテンプレート関数を作ってメソッドに渡せば自由に変更ができます。



「おい待て、C#で作られたライブラリのメソッド使うにはC#で書かなきゃいけないのでは?サクッと使いたい時に不便じゃねぇか!」

というツッコミをした人に朗報なんですが、11月以降の.NET8対応に向けてリファクタリング中のMesでは強化されたPowerShell用のモジュールも公開される予定です。前の記事でそのことに触れるのを忘れていました。
※ちなみにクラスライブラリは.NET言語ならC#以外でも使えます。あなたもPowerShellに目覚めるのです…(パワーシェル イズ パワー)


まぁ難しいことを多少抜いて話すと、↓こんな感じでPowerShellで独自に作ったテンプレート関数を渡して画像付きチャットスタイルが生成できるようになります。

コンパイラ要らずの動的言語(というかシェル言語)でも拡張しやすくてやったね!

ちなみに、上記は整理前の安定バージョンのライブラリを使っているので、少し冗長なメソッド呼び出しになっています。これはいずれ$mes.ToChatStyleHTML($fn)みたいな感じで簡単に呼び出せるようになります。
MesではC#とPowerShellでの利用を前提に開発を進めているので、ガッツリプログラミングにもサクッとスクリプティングにも耐えられるような設計で進めています。
(まぁ僕が便利なように作ってるだけなのですが)


ただ、この機能をWebエディタに組み込むとなると少し話が変わってきて、色々と難しい感じになるのでそこは今後の課題になっています。
(関数ではなくテンプレートテキストで渡すような仕組みになるので、テンプレートエンジンを組み込んだりetc...な感じで少し厄介なのです)


とまぁ、これを書き忘れていたので今回記事にしました。
まだみなさんが上記の機能を簡単に使える状況にはないですが、使えるようにする予定があるよというご報告でした。


前の記事にも書きましたが、Mesは11月まで開発を凍結してリファクタリングに集中しています。そこから.NET8への移植があるので、年内と年始くらいまではほぼ新たな動きは無いと思ってください。

ぶっちゃけ、ユーザーファーストに開発を考えるならWebエディタの機能拡張に注力して「リファクタしてる暇があったら機能拡張しつづけろ」というのがビジネス的には正解で最適解です。これが仕事ならエディタ開発に注力してる。
ただ、Mesは僕にとって砂場なので、現状はユーザーファーストで動いていません。
Mesは記述言語としてもまだまだ未熟なので、時間をかけて熟成させる必要があると思っています。
エディタに利用しているMAUIも発展途上中ですし、エディタの開発はいま急いでも良くない気がしています。覚えたことが無価値になったり、負の遺産になったりするのが継続的にGUIアプリ開発するときの怖いところです。MAUIの噂を聞いたとき、Xamarinで作り始めなくてほんと良かった……
(Xamarinは.NETに多大な貢献をした素晴らしい技術です)


では、また。


余談 : チャットスタイル形式のテキスト生成のコードの抜粋

ここからは少し高度(?)なプログラミングの話です。
わかる人向けに書くので日本語少なめ。

リファクタリング中のチャットスタイルテキスト生成のコードはインターフェースのデフォルト実装で拡張メソッドが参照されるようになっています。
要はミックスインみたいな感じで、インターフェースを継承するだけでデフォルト実装がクラスに実装される仕組みです。
開発中のMesでは、データ加工処理をクラスの外(外部ファイル)に切り出して、Mesクラスではインターフェースを継承するだけのミックスイン実装を採用しています。
拡張メソッドと違ってMesクラスに実装されるので、PowerShellや他言語からも呼び出しができるのがポイントです。
モックのテストをパスしたミックスイン(インターフェース)だけをMesクラスに継承させていくことで、機能追加が安全かつ安定してできるようになります。
データ加工処理を追加したい外部の開発者は、新しいファイルにミックスインを実装→プルリク送る→OKなら僕がMesクラスに継承させて機能追加→リリースみたいな流れになると思います。
編集するファイルが分離されているので不用意な変更が起こりにくくなり、安全性も高くなるのが個人的に嬉しいです。


下記は開発途中のコードですが参考にどうぞ(参考になるか分かりませんが)

//ChatStyleExtension.cs
using Mes.Core;
using System.Drawing;
using System.Text;
using System.Security.Cryptography;


namespace Mes.Core.Extension;

public interface IChatStyleExtention
{
    public IEnumerable<MesPiece> GetMesPieces();
    public IEnumerable<string> ToChatStyleHTML() => ChatStyleExtension.ToChatStyleHTML(this, ChatStyleExtension.DefaultTemplate);

    public IEnumerable<string> ToChatStyleHTML(Func<MesPiece, string> TextTemplate) => ChatStyleExtension.ToChatStyleHTML(this, TextTemplate);
}

internal static class ChatStyleExtension
{
    internal static IEnumerable<string> ToChatStyleHTML(this IChatStyleExtention mes)
    {
        return mes.ToChatStyleHTML(DefaultTemplate);
    }

    internal static IEnumerable<string> ToChatStyleHTML(this IChatStyleExtention mes, Func<MesPiece, string> TextTemplate)
    {
        foreach (var piece in mes.GetMesPieces())
        {
            yield return TextTemplate(piece);
        }
    }

    internal static string DefaultTemplate(MesPiece piece)
    {
        return $"<span style=\"color: #{CharactorNameToColorCode(piece.charactor)}\">{piece.charactor}:</span>{piece.dialogue}";
    }
    private static string CharactorNameToColorCode(string charactorName)
    {
        using (var sha1 = new SHA1Managed())
        {
            byte[] hashBytes = sha1.ComputeHash(Encoding.UTF8.GetBytes(charactorName));
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 3; i++) // 3バイト分のハッシュ値を使用して6桁の16進数表記に変換する
            {
                sb.Append(hashBytes[i].ToString("X2"));
            }
            return sb.ToString();
        }
    }
}

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

1 2 3 4 5 6 7

月別アーカイブ

記事を検索