Pico4 Enterpriseでホームアプリの変更

https://developer-global.pico-interactive.com/document/solution/242196/
今のところ( 2023年1月31日時点 )公式ドキュメントにはPico4のホームアプリ変更方法が記述されていないのでメモ
といってもPicoNeo3Proなどと同様の方法で今のところ設定可能( 所謂キオスクモード、公式でも表記ゆれがある )

自社のアプリが表示されてしまうので今回はテキストベースのみで紹介です

ホームアプリの変更 ( config.txt を利用する方法 )

ここからconfig.txtファイルをDL後、パラメータを任意の値に設定する

open_guide:1
------
home_pkg:com.resolutiongames.abvriop.picovr
------
  • open_guide
    • Picoの電源を入れた際にプレイエリアの設定画面を表示するか否か( 1で表示、 0で非表示 )
  • home_pkg
    • ホームアプリに設定したいアプリのパッケージ名

この時、区切り線として記述されている ------の文字列を変更してはならない
作成したconfig.txtをPicoのルートディレクトリに配置し、再起動すると適用される

ホームアプリの変更 ( 設定から変更する方法 )

  1. ドックから設定を開き、開発者( 開発者モードにする必要がある ) > エンタープライズ設定 > ホーム画面 を開く
  2. 任意のアプリを設定
  3. Pico4を再起動する

現状の問題点と回避方法 ( ホームアプリ上にドックが表示される )

現時点ではホームアプリを変更しただけだと自前のホームアプリ上にドックが表示され、ドックを非表示にするまでは正常にアプリが操作できない
都度ドックを非表示にすれば良いがこれでは展示会などでの手間が増えてしまうので以下に解決方法を記述する

対処方法は以下の通り
1. ドックから設定を開き、開発者 > エンタープライズ設定 > 一般 のドックを表示のチェックを外す
2. Picoを再起動
3. ホームアプリにドックが表示されないのを確認

ホームアプリ側でホームボタンを押したときにメニューを開かないようにしている場合の問題点

ホームアプリ側でホームボタンを押したときの挙動をカスタマイズしてメニュー画面を開かないようにしてる場合、ドックを非表示にすると二度と設定画面に移動できなくなる不具合がある

対処方法は以下の通り

  1. adbでホームアプリをアンインストール
  2. ホーム画面のPicoビジネススイートを開き画面上の設定アイコンを選択
  3. 開発者 > エンタープライズ設定 > 一般 のドック表示のチェックを入れる
  4. Picoを再起動
  5. ホームアプリ上にドックが表示されるのを確認

Windows仮想キーイベント

Windows端末を使っているときに仮想キーコードのイベントを発火し、疑似的にキーを入力したようにするAPI keybd_event()についてのメモ

参考ページ

learn.microsoft.com
www.inasoft.org

サンプルコード

using System.Runtime.InteropServices;

namespace Sample
{
    public static class Win32Api
    {
        // keybd_event()の呼び出し、win32apiを利用する.
        [DllImport("user32.dll")]
    private static extern uint keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);

        // キーの押上.
    private static uint KEYEVENT_KEYUP => 0x0002;
        
        // 仮想キー、0
        public static byte VK_0 => 0x30;


        /// <summary>
    /// 指定した仮想キーコードのキーを押下 -> 押上 処理を行う.
    /// </summary>
    /// <param name="keycode"></param>
    public static void KeyBoardEvent(byte keycode)
    {
        keybd_event(keycode, 0, 0, 0);
        keybd_event(keycode, 0, Win32Api.KEYEVENT_KEYUP, 0);
    }
    }
}

基本的に押下と押上のイベントはペアで扱うのが無難

// 指定したキーコードのキーを押下したイベントを発火する.
keybd_event(keycode, 0, 0, 0);

// 指定したキーコードのキーを押上したイベントを発火する.
keybd_event(keycode, 0, Win32Api.KEYEVENT_KEYUP, 0);

Unity : 反転したmeshを作成し、.assetファイルとして保存するエディタ拡張

自分用のメモ

Sphereのメッシュを裏返して天球画像を張り付けたりするなどの時に作成した
( 結果としては使わなくてもよさそう?ってなったが一応残しておく )

適当なオブジェクトに張り付けてMeshFilterを指定し、MakeReverseMeshボタンをクリックすると反転したmeshを生成し、Assets以下の任意のフォルダに保存する

Sphereのメッシュを反転したものがこれ
 

コード

わざわざエディタウィンドウ作るまでもない機能だったのでコンポーネントのインスペクタ拡張で作成

using System.Linq;
using UnityEngine;

#if UNITY_EDITOR
using UnityEditor;
#endif


public class ReverseMeshMaker : MonoBehaviour
{

    [SerializeField] private MeshFilter _meshFilter;

    
    #if UNITY_EDITOR
    
    [CustomEditor(typeof(ReverseMeshMaker))]
    public class ReverseMeshCreatorEditor : Editor
    {


        private void OnEnable()
        {
            var t = target as ReverseMeshMaker;
            t._meshFilter = t.gameObject.GetComponent<MeshFilter>(); 
        }


        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();
            var t = target as ReverseMeshMaker;

            if (t._meshFilter == null)
            {
                EditorGUILayout.HelpBox("有効なMeshFilterが指定されていません", MessageType.Error);
                return;
            }

            if (GUILayout.Button("Make Reverse Mesh"))
            {
                var reverseMesh = new Mesh();
                reverseMesh.vertices = t._meshFilter.mesh.vertices;
                reverseMesh.triangles = t._meshFilter.mesh.triangles.Reverse().ToArray();
                reverseMesh.RecalculateNormals();

                var path = EditorUtility.SaveFilePanelInProject("ReverseMeshMaker", "reversedMesh", "asset", "裏返したメッシュを作成します");
                AssetDatabase.CreateAsset(reverseMesh, path);
                AssetDatabase.SaveAssets();
                AssetDatabase.Refresh();
            }
        }

    }

    #endif
}

追記

meshを反転させるってことはColliderも反転するので当たり判定が内側になる
これはこれで何かに使えそう

youtu.be

Marauders日記 RedBaron攻略安定化

RedBaron攻略がだいぶ安定してきたのでお勧め装備と立ち回りをメモ

宇宙戦

現状RedBaronはSpacePortとNavyOutpostの組み合わせのマップによく出る ( ここしか出ない? )
船の挙動はSpacePortの周りをランダムに遊泳してからNavyOutpostの方向に移動しUターンするというパターンのみ
SpacePort周りを遊泳しているときは不意に急接近され、船が速攻で破壊される可能性があるので距離にはできるだけ余裕を持たせて遠距離からチクチク攻撃するのが良い
NavyOutpostに向かうフェーズに入ったら真後ろにつけ、つかず離れずの距離を維持しつつ攻撃を当てると破壊しやすい

突入後

武器はL1A1 Battle Rifle、なければ次点でStg-44

L1A1の攻撃力はCompensatorをアタッチすることでダメージ 38 -> 39になりリコイルも18 -> 17に下がる

マガジンもアタッチすれば弾も30発になり気持ち的に余裕が生まれる

次点のStg-44はダメージ34、リコイル12
ややリコイルで有利だがL1A1の17でも近距離戦なら制御は難しくないのでL1A1のほうが単純に火力面で上位互換

もう一枠にはHeavyShield

防具は頭をHeavyStahlhelm、胴はPanzerArmor以上のものを着ていくと即死することはまず無くなる

それ以外の荷物は回復はできるだけ積んだ方が安心感がある

RedBaronのエイムは精度が良いので遠距離戦はかなり分が悪い
見つけたら自分の戦いやすい距離まで盾を構えて接近してから戦うことをお勧めする( 立って構えるとたまに足を撃ってくるのでしゃがんで構える )

背中にHeavyShieldを背負っておけば立て直すために背を向けて距離をとっても後ろからHSされる恐れがだいぶ低くなる

試しに弾切れも狙ってみたがBotはおそらく弾切れは起こさないと思われる ( CommandoでテストしたときはPlayerが視界から消えたらリロードモーションに入ってはいたが... )

youtu.be

RedBaron 20人キル達成



RedBaronの服をアンロック、すごいカッコイイ

↓動画のとんでもなく卑怯な手段を使えばRedBaronをほぼ完封できます
youtu.be

Marauders日記 初のRedBaron討伐

12月のRedBaronアップデートで追加されたレイドボスの討伐

今まで何度かチャレンジしたが直でブリーチングしようとするとすぐに撃ち落されるので船を最初に壊してからブリーチングする作戦で行った

利用した船は Interceptor Frigate
武器は Rocket Artillery を装備

今の仕様だとある程度以上の距離をとるとターゲットから外れるのでつかず離れずの距離で一方的に撃つのが有効 Interceptorの速度( 400 )であればつかず離れずの距離を保ちやすい 出来るだけRedBaronの真後ろにつけ画像の赤い範囲に弾をばらまく感じで撃つと当てやすい

船を破壊した後は射撃されなくなるので接近してブリーチング、内部にはRedBaron一人のみ

RedBaronの所有している武器は [M712 Special] スペックは↓の通り
発射レートが60あるのとRedBaronのエイム自体がかなり良いので油断すると一瞬で死ぬことになる

防具はこんな感じ

勝利した後は船をお持ち帰り

性能としては少し防御力のあるInterceptor Frigateのような感じ、スゴイカッコイイ

RedBaronの乗っているStrike Frigate

Interceptor Frigate

早期アクセスゲームで1月6日まで割引セール中、一緒にプレイする仲間も募集してます

Notionデータベース サブアイテムの使い方とかメモ

Notionのデータベースの機能でサブアイテムなるものが追加されたので使ってみて何に使えそうか考えてみる

↓に試してみたページを貼っておきます

aboard-amethyst-d92.notion.site

使い方はいつも通りにテーブルビューを作成し、メニューからサブアイテムを選択すると利用できる

親アイテムの子要素としてデータベースを構築できるような形になる 親Aには子アイテムあり、親Bには子アイテムなしの構成で作成してみたのが下の画像
また、親 > 子へのリレーションプロパティが自動で作成される( リレーションプロパティを削除すると親子関係が崩れるので要注意2枚目の画像参照 )

親Bの方でリレーションプロパティを選択するとこんな感じ、どうやらサブアイテムサンプルのデータベース自身をリレーションしてるので他の親アイテムの子を選択することも可能

リレーションを削除して親子関係が崩れた状態

ビューごとの見た目

テーブルビュー


上でも示した通り親子階層がわかりやすくなっている

ボードビュー


ボードビューでは親子関係の構造は見た目に反映されていない

タイムラインビュー


タイムラインビューの仕様上日付を入力しないとならないので日付を入れた状態で表示

親タスク、子タスクみたいな感じにして関連するタスクをひとまとめにするとよい感じに纏まって管理しやすいかもしれない

カレンダービュー


カレンダービューでは親子関係の構造は見た目に反映されていない

リストビュー

リストビューでは親子関係の構造は見た目に反映されていない

ギャラリービュー


ギャラリービューでは親子関係の構造は見た目に反映されていない

どう使っていくのがよさそうか?

サブアイテムを適用するとさらに依存関係なるメニューも表示される、これを見るにプロジェクトのスケジュール管理をよりよくする仕組みとして取り入れた機能と思われる

雑に作ってみたがこんな感じでスケジュール管理をするのがよさそう?

依存先タスクの完了日よりも手前に開始日を設定すると依存の矢印が赤くなる

一通り設定してみた

Marauders日記 17 プレステージ回した

次の大型アプデでワイプされるのでプレステージ回して残りの服装解放作業に入る
ひとまずはSASのBODYを開放

レイドから帰ってきたらプレステージ前の物資がそのまま残るバグに遭遇した

一応開発にバグレポートを送信してバグで残ってたアイテムは処分
www.youtube.com

あとプレステージポイントで開放するものは SASのHEADのみ、がんばるぞい