さけのさかなのブログ

同人ゲーム開発やってます。Unity使ったりする。

【Unity】麻雀ライブラリ

github.com

何をするライブラリなのか

 麻雀のルール部分を実装したライブラリです。

 卓上にある牌を管理して、鳴いたりロンしたりといったAPIを提供します。

 あるのはルール部分の実装のみなので、「牌を画面に表示する」「ユーザー操作を受け付ける」「AIが打つ」といった部分は別途開発する必要があります。

使い方

半荘の開始

 GameCreateしてルールを定める

var beforeRoundStart = Game.Create(Random.Range(0, 4),
    new RuleSetting()
    {
        end = new Mahjongs.Rules.EndRule()
        {
            extraRoundScoreThreshold = 30000,
            lengthType = Mahjongs.Rules.LengthType.東風戦,
            suddenDeathInExtraRound = true,
        },
        payment = new Mahjongs.Rules.PaymentRule(30000, 20, 10, -10, -20),
        initialScore = 25000,
        redTile = Mahjongs.Rules.RedTile.赤ドラ3
    }
);

局の開始

var afterDraw = beforeRoundStart.StartRound();

局を進める

APIを呼ぶと戻り値としてIControllerが返ってくるので、これを使ってゲームを進行していく。

// 牌を選択して捨てる
var afterDiscard = afterDraw.Discard(tile, riichi: false);

// 捨てられた牌を鳴く
if (afterDiscard.CanChi(player))
{
    var afterDraw = afterDiscard.Chi(player, tile);
}
else
{
    // 鳴かないなら下家へ手番を移す
    // このとき流局判定も行われる
    var afterDraw = afterDiscard.AdvanceTurn(out var roundResult, out var finishRoundStates);
}

局の終わり

 流局や上がりを処理するAPIは、RoundResultを返す。

// ツモ
if (afterDraw.CanTsumo())
{
    var roundResult = afterDraw.Tsumo(out tsumoResult);
}
// ロン
if (afterDiscard.CanRon(player))
{
    var roundResult = afterDiscard.Ron(out ronResult, player);
}
// 次の局を開始する
var afterDraw = roundResult.beforeRoundStart.StartRound(); 

ゲームの終わり

 RoundResultgameResultを持っている場合はゲーム終了。

if (roundResult.gameResult != null)
{
    // 終了処理
}

できていないこと

 ローカルルールは設定で切り替えられたらいいなあ

  • ダブル役満
  • 国士無双の暗槓の槍槓
  • オープンリーチ
  • 花牌、季節牌(赤牌は実装済み)
  • 九種九牌処理(流せません)
  • 四家立直(流れません)
  • 三家和(通常通り点の支払いが行われます)
  • トビ無し(トビあり固定)
  • 食いタン禁止(アリ固定)
  • 喰い替え禁止(あり固定)
  • 焼き鳥(なし固定)
  • 八連荘(何も起こりません)
  • 二翻縛り(常に一翻縛り固定)

追記

 そういえば壁牌や山牌の状態については無頓着で、とりあえずシャッフルしてListにしてある牌を前からとっていくだけというものになっています。 何がまずいかというと、鷲巣麻雀のような山牌もちゃんと管理しなきゃいけない変則ルールに対応できないんですね。要る?

追記2

 鷲巣麻雀では山牌は見えずにランダムでしたね

コミケで頒布予定だったもの

 アクリルフィギュア2種類。イラストは茹でピーさんに描き下ろしていただきました。

f:id:enuenupi:20200430080359p:plain  かわいいですね。

f:id:enuenupi:20200430080406p:plain  サイズ参考。

 というわけで次以降サークル参加したら持っていきます。

4月10日にMagicScrollTactics PS4リリースです

f:id:enuenupi:20200408134359j:plain

 といっても特に追加要素とかはなし! 細かいバグが見つかったのを直したりとかはあるんですが(効果音まわりとか)、ゲームプレイに関して影響のある変更はありません。遊びたいハードで買おう!

 ということで、これがMSTに関して現状最後の弾(正月に言ってた「やり残し」)です。なんかSwitch版からえらく時間がかかりましたが、振り返ってみれば燃え尽きてました少々。もう何回通しプレイしたか分かんない。これ以上ゲームが長くなると通しプレイが日をまたぐことになって体力精神ともにきっついなーという感じなので、開発者の皆様におきましては長いゲームにとりかかる時は正気を投げ捨てましょう。二周目とかどうすりゃええねん。

 オートプレイは(デバッグ用ではなく)標準機能として実装しとくととても助かります。おすすめ。

store.playstation.com

【Unity】CameraのViewportRectのレイアウトが崩れないようにする

 Cameraのスクリーン上の描画範囲はViewportRectによって設定できる。が、そのままだと使いづらいので、補助のためのスクリプト

 具体的には画面アスペクト比が変化してもレイアウトが崩れないようにできる。(UIのCanvasScalerと同じような感覚で使える)

github.com

f:id:enuenupi:20200218092514p:plain

【Unity】自作パッケージのサンプル作成

 ようやく自作パッケージのサンプルコードに着手しはじめた。とりあえず分かりづらそうなところで、翻訳、ルビ表示、ファイル読み書き。

github.com

github.com

github.com

 サンプルコードはpackageManagerからインポートできる。

f:id:enuenupi:20200215213215p:plain

参考

https://forum.unity.com/threads/samples-in-packages-manual-setup.623080/

2020年のこと

去年振り返り

toriden.hatenablog.com

やること

MST

 去年に海外のSwitchで出せて一区切りついた……んだけど、実はまだやることが残ってたりする。というわけで今年はまずそれだ。そのうちなんか出せると思います。

次作品

 なんやかんやで伸び伸びになってますね! この時点で難産なんですが。がんばる。

 出すとすればまずはSteamアーリーアクセスになると思います。そこでバグ対応しつつ翻訳対応して正式リリースの流れかなあ。

 (それはそれとしてさっさとストアページは作ろう つくりたい)

裏方

 去年はあんまりなんもできてないなーみたいな感じなんですが、見えないところでちょこちょこ動いてたりします。

 開発に全速を出すのも一つのやり方だとは思うんですが、そうではなくもうちょい防御的に、見えてる爆弾を片づけたり。とにかく即死しないように布石を置いてみたりだ。

 というわけで去年に仕込んでおいたものを今年は回収していこう。まあ見えないんですが。

イベント

 コミケとかのイベントで何をやるか?というのは、すっかりWebが主戦場になった当サークルではずっと課題なんですが、冬コミでMSTの小説本を書いてみて、こういうのでもいいかなあ。とか思ってみたり。

 リリース済み作品関連で何か出す感じ。アクスタとか……アクスタとか

GitHub

 去年の後半ぐらいからなんですが、UnityPackageという形でリポジトリをちょいちょい公開しています。まあ基本的に自分用なんですけど(複数プロジェクトでモジュール共有しようとするとこうなる)、コード公開は良い文化なので今年もやっていく。

 欲を言えば他の開発者の役に立てれば良いんですが、ドキュメントなりサンプルなりを用意せえという話なのでメンドクササが倍増し、まあでも今年は欲をかいてその辺を目標にやっていきましょう。

【Unity】音まわりパッケージ

ナニコレ

 そろそろ音まわりの処理が共通化できそうだなーということでやってみる。

 とはいえ音に関してはこだわったことをしたことがないので、機能は必要最低限という感じ。FPSなんか作るともう少し演出的にやるべきことができるんだろうけど…。

リポジトリ

github.com

機能

  • BGMのフェードアウトつき遷移
  • BGMアセットの読み込み先切り替え(アセットバンドル or 内部アセット)
    • ただし、アセットバンドル版だと起動時に全部読み込んでメモリに乗せるというゴリ押しの実装になっている。
      • というのもロード処理に関してはハードの影響をモロに受けるので、ベストプラクティスな書き方がないように見える。なのでとりあえずはロード時間が問題にならない方式を用意しておいた。
      • ロード処理はある程度アプリ側で書けるようにしてある。IMusicStoreを実装すればいい。
  • 効果音同時再生の抑制
    • 同じ音が大量に同じフレームに鳴って潰れる、みたいなのを回避する。
  • ちょっとした工夫として、使い終わった音声ファイルは(設定されていれば)AudioClip.UnloadAudioDataを呼んで使用メモリを減らすようにしている。

TODO

 これまで作ったパッケージの機能を網羅するサンプルプロジェクトがあればいいかなあ。