nearlanのブログ

ただのメモ ちゃんとした記事は別で

ツイ垢のステータス変動とか

もう既に翻訳してる人はいそうだけど、個人的なメモとして。詳細を掘り下げると長そうなのでマジでメモ

 

3月末にTwitterアルゴリズムが公開され、それを解析した海外ニキ(@aakashg0)がスレッドで説明してくれた

詳しく知りたかったら当該ツイートを見てってや

 

端的に言うと、行動や反応(あるいはエンゲージメント)に応じてそのアカウントのステータスが変動するという話。

気になったところだけざっと抜粋

 

  • いいねされる::30倍+
  • RTされる:20倍+
  • リプライされる:1倍+
  • 画像・動画を投稿:2倍+
  • 外部リンクを貼る:パラメータ減少、エンゲージメントが不足してるとスパム扱い
  • ミュート、フォロー解除、ブロック、スパム報告、違反報告をする:パラメータ減少
  • 課金する(Blueに登録):パラメータ増加(2or4倍+?)
  • 誤情報を発信する:パラメータ大幅に減少 ※タグによって誤報とみなされるカテゴリが決められている
  • アカウントは似た垢同士で「クラスタ」に自動で振り分けられている
  • クラスタに沿わない(out of network)投稿をする:パラメータ減少
  • 誤字脱字をする、造語を使う:パラメータ減少 ("不明言語"としてみなされると大幅に減少)
  • アカウントは3つのデータポイントで構成
    • エンゲージメントデータ:いいね、RT、リプされた情報
    • ユーザーデータ:ミュート、フォロー解除、スパム報告した情報
    • フォロワーグラフ:誰にフォローされているかについての情報

 

よく言われるシャドウバンとかはこの辺を参照して決められていたのかもしれない。

物理テスト

無駄に長くMMDは使いながらも、自分で物理演算をセットアップしたことがなかったのであった

ある程度分かった気になったら汎用的なパラメータとか、補助ツールの使用感とかまとめてみたい

 

 

帽子のつばの部分は平面剛体をつけるより、回転制御で対処したほうが楽そう?

コンパイルを早くする

2018以前とかと比べると「なんかコードをちょっと変えるだけで微妙にコンパイルに時間かかるようになったなぁ」と思ってたら回避する方法があるらしい

 

Windows Defenderから除外

設定->更新とセキュリティ->Windowsセキュリティ->ウィルスと脅威の防止->設定の管理->除外->除外の追加または削除->除外の追加->フォルダ

これで対象プロジェクト、Unityのプロジェクトを全部同じフォルダに入れてるならその最上位のやつを指定

Hot Reload for Unityを入れる

hotreload.net

Package ManagerからURLでインストール。個人向け(無料)とインディーズ向け(有料)がある

ディスク(HDD)100% 対処メモ

色んなソフトをゴチャゴチャ入れてたりすると定期的に悩まされる問題。普通にググると広告記事ばっかり上に出てきて不便なのでここにメモ。

 

役に立ちそうな記事

kaoruya.org

ikasenmo-answer.com

otarunet.com

かんたんまとめ

手動でWindows Update

とりあえず最初はこれ。水曜日には再起動を強いられがちだが仕方ない

Windows SearchやSysMainを無効化

よく聞く対処法だがあんまり効いてる実感がない。一定のスペックが無いと逆効果らしい

ドライブのエラーチェック

別にエラーが無くても、スキャンするだけで良くなることがある

デフラグする

自動的に行われているはずなので、手動でやるのは非推奨と聞いたことがあるけどどうなん?

バッテリー設定を変える

電力が足りていない場合があるらしく、「バランス」を「高パフォーマンス」に変える

Windowsを再インストールする(最終手段1)

データが全部飛ぶけど確実らしい

OSをSSDに移す(最終手段2)

金を払って解決する。最初からこうしておけば困らないらしい

かんたん Yaw Pitch Roll

InputSystemを使って実装しようと思ったけど結局使わなかった編

 

動画

 

コード

以下の動画のコピペです。Thank You!!

意外とシンプルな実装方法が探しても見つかりにくかった

www.youtube.com

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SpaceshipMovement : MonoBehaviour
{
    public bool throttle => Input.GetKey(KeyCode.Space);

    public float pitchPower, rollPower, yawPower, enginePower; // 参考値:140, 180, 120, 90
    private float activeRoll, activePitch, activeYaw;

    private void Update()
    {
        if (throttle)
        {
            transform.position += transform.forward * enginePower * Time.deltaTime;

            // InputManagerで各種軸を定義しておく
            activePitch = Input.GetAxisRaw("Vertical") * pitchPower * Time.deltaTime;
            activeRoll = Input.GetAxisRaw("Horizontal") * rollPower * Time.deltaTime;
            activeYaw = Input.GetAxisRaw("Yaw") * yawPower * Time.deltaTime;

            transform.Rotate(activePitch * pitchPower * Time.deltaTime,
                activeYaw * yawPower * Time.deltaTime,
                -activeRoll * rollPower * Time.deltaTime, Space.Self);
        }
        else
        {
            activePitch = Input.GetAxisRaw("Vertical") * pitchPower/2 * Time.deltaTime;
            activeRoll = Input.GetAxisRaw("Horizontal") * rollPower/2 * Time.deltaTime;
            activeYaw = Input.GetAxisRaw("Yaw") * yawPower/2 * Time.deltaTime;

            transform.Rotate(activePitch * pitchPower * Time.deltaTime,
                activeYaw * yawPower * Time.deltaTime,
                -activeRoll * rollPower * Time.deltaTime, Space.Self);
        }
    }
}

ロールだけは入力と逆方向に回転するのでマイナス演算で反転。

この実装では前進している時(Spaceが押されている時)と停止している時とで回転速度が切り替わるようにしてある。ここは好みの問題

その都度書き換える手間はあるもののジョイスティックにも切り替えられる。ただ、キーボード入力からジョイスティック入力にすると何故か無操作でも少しずつ回転する現象が発生。こっちのパッドの問題かもしれない。

これに加速度を付けたり、カメラと機体の動きを分離できるようにしていくのが今後の想定

 

使用アセット

assetstore.unity.com

assetstore.unity.com

InputSystemを使えるようにするメモ

とある移動用スクリプトを試そうと思ってけどそれ以前の問題に突き当たってしまったので

 

Unity自体をしばらく使ってなかったので、その間にそれまでのInputManagerがレガシー化して新しいInputSystemが登場。それをPackage Managerからインポートして使うわけだけど、古いプロジェクトだとどうもそれがスクリプトに上手く反映されず(UnityEngine.InputSystemが認識されない)、結局最新のLTSで新しいプロジェクトを作り直して、まずはInputSystemの基本仕様を確認することに。

 

自分でも何を覚えていて何を知らないのかを忘れてるので、整理されてない散らかった文になる可能性大

 

大体以下の動画のトレース(~13分くらいまでがこの記事の内容)

www.youtube.com

 

 

Input Actionsを作る

まずAssestの中で右クリックして「Input Actions」を作る。この時点で既に旧式のInputとやり方が違う。知らなかったら気づかなそう

この中で入力に関連する変数とかを個別に設定できるので、旧式より取り回しが良くなる、というのはわかる

 

Actions Properties

ActionMapsで新規のActionMapを作って「Player」とする。Actionsは「Jump」とし、ジャンプ用の設定を作る。

Acition Typeの「Button」はもちろんボタン、「Value」はジョイスティックなどの入力され続ける値、「Pass Through」はValueの特殊な使い方らしいがとりあえず置いておく。今回はジャンプなのでButtonを使う

Interactionsではホールドやタップといったボタンの押され方の設定ができる。今回はそのままにしておく

Binding Properties

JumpのプルダウンにBinding、キーバインドの設定がある。Binding->Pathのプルダウンに設定するパッドなりマウスなりのボタンを選べる。テキストで直接指定もできるらしい

「Listen」を押すことで、その直後に押したキーやボタンが認識されて自動的に絞り込まれる。たぶんこれが楽。ここではSpaceキーを選択

 

これでごく基本的なInputの設定が出来たので、「Save Asset」で保存する。左上のタブに*があったらまだ保存されてないので注意。その横に「Auto-Save」のチェックボックスもある

 

Sceneのセットアップ

Inputを試すためのテストSceneを用意する。デフォルトのPlaneとSphereを追加、特に弄らない

Player Inputの設定

SphereにAdd Componentから「Player Input」を追加。ここのActionsに先ほど作ったPlayerInputActionsを適用する。ActionMapは1個しか作ってないのでDefault Mapはそのまま。UI Input ModuleやCameraは今は使わない

Behaviorは主にスクリプトでのアクションの取得方法を決める。一般的には「Invoke Unity Event」が使われるらしい

Eventsにはデフォルトでは3種類のEventが表示される。「Device Lost Event」は例えばパッドが外れた時、「Device Regained Event」はそのパッドが再接続された時、「Controls Changed Event」はパッドからキーボードなどに切り替わった時をそれぞれ表す。

先ほど作った「Player」のイベントも作られているので、そこの+ボタンで設定を行う(まだやらない。ここに適用する簡単なスクリプトを用意する

簡単なスクリプトのテスト

C#スクリプト「testingInputSystem」を作り、Sphereに追加する。内容はこれだけ↓

public class testingInputSystem : MonoBehaviour
{
    public void Jump() {
        Debug.Log("Jump!");
    }
}

SphereのPlayer Input->Events->Playerの+ボタンを押して、下の項目にはSphere自身を、右の項目にtestingInputSystem->Jumpを設定する。この時、Playerではなく他のDevice Lost Eventなどに間違って設定しないよう注意(1敗)

これでSceneを再生してスペースキーを押すとConsoleのログにJump!と出るはず

ログだけではアレなので実際にジャンプさせるコードも追加↓ Rigidbodyが無かったら付けておくのを忘れずに

public class testinginputsystem : MonoBehaviour
{
    private Rigidbody sphereRigidbody;

    private void Awake() {
        sphereRigidbody = GetComponent<Rigidbody>();
    }

    public void Jump() {
        Debug.Log("Jump!");
        sphereRigidbody.AddForce(Vector3.up * 5f, ForceMode.Impulse);
    }
}

ボタンを押したときだけジャンプする

なおこの時ログを見ると、ジャンプを1回するたびに3回表示されてるのが分かる。これは「最初に押された時」「現在押されている時」「離された時」の3回の判定が行われているから。

このことを実際に確認するためにJump関数の引数にCallbackContextを追加する。(使うためにInputSystemの宣言が必要)

using UnityEngine;
using UnityEngine.InputSystem;

public class testinginputsystem : MonoBehaviour
{
    private Rigidbody sphereRigidbody;

    private void Awake() {
        sphereRigidbody = GetComponent<Rigidbody>();
    }

    public void Jump(InputAction.CallbackContext context) {
        Debug.Log("Jump!" + context.phase);
        sphereRigidbody.AddForce(Vector3.up * 5f, ForceMode.Impulse);
    }
}

これでSceneを再生してまたspaceでジャンプすると、ログに"Jump!Started"(押した), "Jump!Performed"(押している), "Jump!Canceled"(離された)と判定の順番に表示されるのが分かる。

これを一般的な実装のように、ボタンを押したときだけジャンプの処理が行われるように変更するため、Jumpにif文を追加する

public void Jump(InputAction.CallbackContext context) {
        if (context.performed) {
        Debug.Log("Jump!" + context.phase);
        sphereRigidbody.AddForce(Vector3.up * 5f, ForceMode.Impulse);
        }
    }

これでもう一度Sceneで確認すると、判定が1回分だけになり、その分ジャンプする高さも下がる

C# Event

同じことをC#イベントを使って実装する場合を考える(実装するところまではやらない)。Player Input->Behaviorを「Invoke C# Event」に切替。コンポーネントからイベントを設定していたのを、代わりにスクリプト内で行う

public class testinginputsystem : MonoBehaviour
{
    private Rigidbody sphereRigidbody;
    private PlayerInput playerInput;

    private void Awake() {
        sphereRigidbody = GetComponent<Rigidbody>();
        playerInput = GetComponent<PlayerInput>();

        playerInput.onActionTriggered += PlayerInput_onActionTriggered;
    }

    private void PlayerInput_onActionTriggered(InputAction.CallbackContext context)
    {
        Debug.Log(context);
    }

    public void Jump(InputAction.CallbackContext context) {
        if (context.performed ) {
        Debug.Log("Jump!" + context.phase);
        sphereRigidbody.AddForce(Vector3.up * 5f, ForceMode.Impulse);
        }
    }
}

変更点はPlayerInputクラスを使った処理の追加。詳しい仕様については後でリファレンスを見るけど、1つにまとまったInputActionのイベントを格納できるので、この関数の返り値をそのまま代入する書き方でいいらしい。

Scene再生で確認すると、Spaceキーを押したときの情報が↓のようにログに表示されているのがわかる。

action=Player/Jump[/Keyboard/space] phase=Started time=8.15317470000082 control=Key:/Keyboard/space value=1 interaction= }

 action=Player/Jump[/Keyboard/space] phase=Performed time=8.15317470000082 control=Key:/Keyboard/space value=1 interaction= }

action=Player/Jump[/Keyboard/space] phase=Canceled time=8.28674000000319 control=Key:/Keyboard/space value= interaction= }

Invoke Unity Eventと同じことをする場合、この情報をもとにスクリプトからphaseを識別して、それに応じた処理を書くことになるらしい。動画では、今回のような目的ではInvoke Unity Eventを使うのが適切だと結論付けられてる。(Behaviorを元に戻す)

 

とりあえずここでいったん区切り

VIVID顔文字

ちょっと必要になったのでメモ

3分の1くらい手動なので半角全角が違うかも

実際には行毎に特定の組み合わせで並んでる

 

(>▽<★☆

★(*^▽゜)v

☆*♪(○´▽`○)♪.*☆

(。ゝω・)bナルホドネ!!

(・ω・`)

゜+.(☆´∪`☆)゜+.゜

★★(>▽<m)Дππα★★

Ξ★ (*^▽゜) v

【≡≡】\_(*・ω・)ハイ、ココネ、ココ!!

(>▽<m)

ヽ(☆≧▽≦) (≧▽≦★)丿