【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【WordPress 専用】クラウドサーバー『ウェブスピード』

【WordPress 専用】クラウドサーバー『ウェブスピード』

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【予約システム開発】EDISONE カスタマイズ開発サービス

【予約システム開発】EDISONE カスタマイズ開発サービス

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【200ヶ国以上に対応】グローバル eSIM「ビヨンドSIM」

【200ヶ国以上に対応】グローバル eSIM「ビヨンドSIM」

【中国への旅行・出張・駐在なら】中国SIMサービス「チョコSIM」

【中国への旅行・出張・駐在なら】中国SIMサービス「チョコSIM」

【グローバル専用サービス】北米・中国でも、ビヨンドのMSP

【グローバル専用サービス】北米・中国でも、ビヨンドのMSP

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

ビヨンドランチのメンバーを抽出するツールの改修

お疲れ様です。
システム開発室、松山です。

前回、ビヨンドランチのグループ分けをする簡単なツールを作成しました。
前回のブログはこちら
お陰様で組織文化委員会のメンバーからとても感謝されています。(妄想)
が、やはり単にランダムでグループ分けするだけでは機能が足りないと、
原岡社長から厳しくも温かいご指摘を頂いたので、もう少し作り込んでみましょう。(現実)

要件

① 毎月開催されるので、月指定できるようにする
② 抽選したデータを保存(読み込み)できるようにする
③ 抽選済みの月を選択したら、決定しているグループを表示
④ 前月と同じメンバーが被らないようにする(なるべく)
※ Unity 2019.4.18f1(LTS)にアップデート

こんな感じですかね。
Unity 機能的には ②, ③ で PlayerPrefs を使うくらいでしょうか。
あとはプログラム次第な感じです。

① 月指定できるようにする

前回、抽選ボタンを作ったあたりに、月指定する UI(Button と Text)を追加していきます。
こんな感じです。

日付については、System.DateTime を使えばよいので、起動時に現在の日時を取得して、
左右ボタン(◀︎ / ▶︎)で AddMonth() により更新します。
表示は年月のみなので、year と month を Text に設定してあげます。

あと、画面サイズについて見直します。
WebGL のデフォルトの解像度は 960x600 ですが、ProjectSettings で変更できたので 1960x1080 に設定します。

Canvas のサイズも変更して、UI のレイアウトも調整していきます。

全体は、こんな感じです。
左右スカスカですが、ご愛嬌ということで。

② 抽選したデータを保存(読み込み)できるようにする

抽選したグループのデータ(メンバー)を保存します。
ローカルでの保存は PlayerPrefs を使うのがよいですね。
PlayerPrefs の説明はこちら

任意の Key に対して、値(Value)を設定できるので、まずは Key のルールを決めます。
年月とグループ番号でユニークなキーとします。

string key = string.Format("group_{0}_{1}_{2}", GroupNo, date.Year, date.Month);

保存する値はメンバーの名前ですね。
あとで Split() でバラすのでスペース(半角)で区切って文字列にします。

string val = "";
for(int i=0; i<memberNames.Count; i++)
{
    if (i > 0) val += " ";
    val += memberNames[i];            
}

これで、Key と Value を用意できたので、PlayerPrefs に保存します。

PlayerPrefs.SetString(key, val);
PlayerPrefs.Save();

簡単ですね。
仕事などでまじめに使う際は暗号化してから保存しますが、今回は社内ツールなので平文でいいかなと。

③ 抽選済みの月を選択したら、決定しているグループを表示

② で保存したデータを PlayerPrefs から読み込みます。

string val = PlayerPrefs.GetString(key);
string[] members = val.Split(' ');

あとは読み込んだデータを UI に反映させれば OK です。

④ 前月と同じメンバーが被らないようにする(なるべく)

最後に抽選時に、前回(先月)と同じメンバーが被らないように判定を追加します。
今回は、以下の場合に再抽選するようにします。
1. 前月と同じグループ(リーダー)に入らない
2. 前月と同じメンバーと被らない
ただし、無限ループ対策として、5回連続で再抽選になった場合は、被っていても OK とします。

まず、各グループの先月のメンバーを読み込んでおきます。
その後、候補をランダムで抽選してから以下の判定を行います。

前月と同じグループ(リーダー)に入らない

抽選した候補者が、先月同じグループにいたか判定します。
先月のメンバーは List に格納されているので、Contains() で確認します。
もし、同じ場合は再抽選。

前月と同じメンバーと被らない

抽選した候補者が、先月どのグループにいたか調べます。
先月のグループメンバーと、今月入る予定のグループに既に登録されているメンバーを比較し、
同じメンバーがいたら再抽選。
どちらのメンバーリストも List なので、foreach で回して Contains() で確認します。

public bool IsSameMember(List<string> lastManthMembers)
{
    // 今月のメンバーに、先月のメンバーがいないかチェック
    bool isSame = false;
    foreach (string mem in memberNames)
    {
        if(lastManthMembers.Contains(mem))
        {
            isSame = true;
            break;
        }
    }
    return isSame;
}

ん〜、微妙にイケてない感ありますが、良いアイデアがでないです。
が、正しく動作はすると思います。

まとめ

なんとか要件は満たせたのかなと思います。
・月指定できる(System.DateTime)
・抽選したメンバーを保存(読み込み)する(PlayerPrefs)
・先月メンバーと被らないようにする(自前実装)
・ついでに解像度を調整(WebGL)
今回も基本的な機能だけで組み立ててます。

とりあえず、ビヨンドランチのツールはこれで完成(ver1.0.0)とします。
もし要望あれば機能改修しますので、お気軽にお問い合わせください。
それでは、今回のお話はこれまでになります。

Git は更新しておきます。
何かの参考にでもなれば幸いです。
Unity サンプル

最後に

私が所属するシステム開発のサービスサイト「SEKARAKU Lab(セカラク ラボ)」を開設しました。
ビヨンドは、サーバーの設計・構築から運用までをワンストップでお任せいただけますので、サーバーサイド開発でお困りの方はお気軽にお問い合わせください。
SEKARAKU Lab:[https://sekarakulab.beyondjapan.com/](https://sekarakulab.beyondjapan.com/)

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
0
読み込み中...
0 票, 平均: 0.00 / 10
479
X facebook はてなブックマーク pocket
【2025.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

【2025.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

この記事をかいた人

About the author

松山賢勝

長くゲーム開発会社でプログラムやプロジェクトマネージメントなどの業務に従事。
2019年より株式会社ビヨンド に入社。横浜オフィスに勤務。
サーバーサイド開発業務のプロジェクトマネージメントを中心に担当。(時々、プログラミング)
趣味は自転車(ロードレーサー)と競馬観戦。