Minecraftデジタル信号① 基礎回路
騎空団内のMInecraft鯖が立ったので、記事を書く。
技術部の人が既にやってるようなことだが、wikiにも出てないのでデジタル信号の送り方をまとめようと思う。
そもそも何でデジタル信号にするのかというと、Minecraftだとアナログ信号が扱いにくいためである。
信号の強さが1マスごとに減少してしまう上に、リピーターを使った瞬間に最大値へ上書きされてしまうため、量の情報が即座に失われてしまう。
しかし信号を有る無しの1と0で表現するのであれば容易であることが背景にある。
まず信号の発生では一瞬だけON信号を送ったほうが何かと都合が良いので、パルサー回路を最初に用意する。
リピーターは2クリックで3tick遅延とする。
次に01信号を作る。
回路としてはシンプルで、1クリックしたリピーターを重ねて、2tickごとの遅延の差を作った情報を取り出すだけだ。
点線部に配置するかしないかで000や010という表現が出来る。
ちなみに、色が薄い四角はハーフブロックだ。ハーフブロックは上側にしか信号を伝えないので何かと便利。
最後にデジタル信号を受信する必要がある。
イメージとしては、信号を遅延ごとにわけて受けて、開始信号を利用して一瞬だけ読み取る。
今回は6tick分の信号を受信しきった瞬間にだけリピーターのロックを解除して欲しいので6+6+1=13tick分だけ遅延させている。
ちなみに011の時のみ動作する回路とかを目指す場合は、次のような受信器が必要。
実際に受信してライトにしてみた例だ。見事、真ん中だけ消灯していることが確認できる。
応用すれば、1本の線路で複数の信号を受信できるようになる。まあ、それは今後やりたい。
グラブルの動向・無くなるかもしれない環境部屋(2020/04/06)
グラブルの動向及び未来予測
- 放置狩りの駆逐と、無くなるかもしれない環境部屋
- どうして最近はソロコンテンツが多いのか?
- どうしてマグナ3は未だに来ず、撃滅戦武器は殺されたか?
- ジョブ制限と多様性について
- キャラの煮詰まりと総力戦コンテンツの実装について
放置狩りの駆逐と、無くなるかもしれない環境部屋
アルバハHLの放置狩り対策として、自発時のドロップ率引き上げと、救援時のドロップ率引き下げが予告された。この理由としては、同時期に予告された古戦場の戦貨ガチャの上限設定に近い意図があると思われる。長期的にみて強いプレイヤーばかり強くなる格差が無視できなくなったのだろう。
つよばはの環境部屋も同様の状況なのだが、課金額が関わるセンシティブなコンテンツであるため今回はノータッチなのだと考えられる。しかし、今後つよばはも変更が入る可能性は高い。
一方でグランデHLはアーカーシャとわざわざ同じ青箱方式を設定してきたため、運営としてはこの方式がお気に入りなのだろう。将来的には、つよばはもアーカーシャ方式になるのではないかと予想している。そうなると、自発の旨味が無くなると同時に、一位を取れずともヒヒイロカネを稼げる方式に変化する。
どうして最近はソロコンテンツが多いのか?
最近、実装されたソロコンテンツとしては、天上征伐戦、六龍HL、孤高の翼称号が代表的だろう。
なぜ、ソロコンテンツが増えてしまったのか。それには2つ原因があると思っている。
1つは「青箱による弊害」だ。
青箱はワンパン放置対策として導入され、貢献度を稼ぐほど落ちやすい仕組みになっている。マグナIIの実装から目玉アイテムと言えるものは青箱に入れられることが多くなり協力ゲームからレースゲーム化が進行した。
その弊害として一部ジョブは使う意味が薄くなってしまった。例えばカオスルーダーやエリュシオンなどが顕著。以前はデバフを入れてみんなに貢献すればよかったのだが、今は他人を利するばかりで自分が稼げないのだ*1。
そこで使う意味の薄くなったジョブに意味を持たせるため、ソロコンテンツ側を充実させたと思われる。ソロなら他人に迷惑がかかることも無いので、普段使わないジョブを試したり、高難易度向けと呼ばれるようなジョブを使う機会にもなる。
また、青箱は「強くないと強くなれない」を助長してしまったため、他人と争わないコンテンツの充実を図ろうとした面もあるだろう。
2つ目は「wikiに書かれていた内容」だろうと思う。
グラブルは各種攻略サイトに「クラス4は共闘に行かなくても取得できると書いてほしい」というぐらいには、攻略サイトを確認している。
そんな中、wikiのジョブ項目に一昔前はこう書かれていた。単発高難易度向けのアサシンは周回コンテンツが多いグラブルと致命的に合わない、と。おそらくだが、それが読まれて、活躍の機会を持たせたのではなかろうかと推測している。
今後もマルチは増えるだろうが、ルシファーHL(HARD)のように他人と協力してクリアするのがメインで貢献度報酬は不味いタイプ、予告されている六龍HLのようにソロがクリア出来ない人のための救済措置、がメインとなっていくのではなかろうかと予想できる。
現状、ソロ向きとされるようなキャバルリーのようなジョブは確保して損はないだろう。
どうしてマグナ3は未だに来ず、撃滅戦武器は殺されたか?
マグナ2の実装はグラブル4周年のことなので、実に2年が経過しているのだがマグナには目立った強化がなされていない。
アストラルウェポンは数値だけなら撃滅戦武器を完全に上回っている。(もちろん適材適所ではあるが。)
この理由はシンプルで「マグナ・オプティマス両者が回るコンテンツの実装が難しいから」である。
オプティマス編成に移行している場合はマグナに比べて、マグナ2周回の意義が無い。もちろん、エウロペのマグナアニマなどを求めて回りはするが、マグナ程ではないだろう。
今、マグナ3が実装されてもオプティマスに移行した上級者はそれほど回らないだろう。それでも両者が欲しい武器となると、EX攻刃武器となる。それ故に撃滅戦以降は、ブレグラ、アーカーシャと何かとEX攻刃武器が多くなっている。
別パターンでは、両方の武器が作れる終末の神器やドラゴニックウェポンが挙げられる。
今後も EX攻刃武器は増え続け、上位互換が出続けると予想できる。最前線を走らないのであれば、取れないものがあっても上位互換が来るという気長な考えで良いのかもしれない。
ジョブ制限と多様性について
最近の運営は高難易度=スパルタという図式を崩したいのだと思われる。
一時のアルバハHLはセージとスパルタのみでそれ以外はあり得ないという状況になってしまった。そのためか、アーカーシャや四大天司HLなどファランクス無効ギミックが続いた。
同様に(機能はほとんどしていないが)黒羽の福音というジョブ数でのダメージ制限をかけるようにしたのではないだろうか。
そしてバトルシステムVer2でもこの意図は続いている。ガード機能により、ファランクスで防御を行わなくても高難易度に挑めるようになった。
今後も、様々なジョブを使う機会を与えようとすると予想できる。とりあえず、全部のジョブは取得して損はないと思われる。
キャラの煮詰まりと総力戦コンテンツの実装について
例えば一時は水パは席が無いと言われるほどに、キャラが煮詰まっていた。
この状態が放置されるとガチャが回らないので問題がある。かといってキャラのインフレは嫌われるので、キャラの数自体を要求するようなコンテンツを実装したのだろう。この流れはまだ続き、バブ・イールの塔の実装も予告されている。
武器や召喚石についても同様で、リミ武器が敷き詰められてしまえばガチャは回りにくくなる。しかし、その流れを大きく変えたのが水着カリオストロである。特定のスキルに着目し、それと相性が良いという方向だ。
今後も様々なキャラ・武器・召喚石を使わせたいという意図が出てくるだろうと予想出来る。特定のキャラや武器に一極集中だと泣きを見るかもしれない。
*1:エリュシオンはウルリクムミを使用した高貢献度を稼ぐ方法があるが、ここは一般論のため目を瞑る
えもふりでVtuberの真似事をする⑥ 背景を透過し画面構成する
こんな感じで本格的な画面構成が出来るようになる。
①まずUnityのメインカメラでバックグラウンドをVの肉体で使ってないカラーに変更する。
②OBSのソースで、映像キャプチャデバイスを右クリックし、フィルタを選択。
エフェクトフィルターで+を押し、クロマキーを選ぶ。先ほど設定した色を消すように設定すると透過できるように。
③ソースに画像を追加して、背景や、追加情報、配信者のアイコンといったものを置いていき画面構成する。
終わり。
えもふりでVtuberの真似事をする⑤ キー入力で表情を変える
前回まででマウスを目線で追い、喋りに合わせて口パクもしてくれるようになった。
今回は次のように表情を変えられるようにしてみたい。
今回は「Test3」のスクリプトを作成。前回と違うのは中身だけなので説明は省略。
以下スクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test3 : MonoBehaviour
{
public EmotePlayer targetPlayer;
public float time;
// Start is called before the first frame update
void Start()
{
if (targetPlayer == null)
targetPlayer = this.GetComponent(typeof(EmotePlayer)) as EmotePlayer;
time=600;
}
// Update is called once per frame
void Update()
{
if (time>1) time--;
else targetPlayer.mainTimelineLabel="動作リセット";
//動作の操作部分
if (Input.GetKey(KeyCode.A)) {targetPlayer.mainTimelineLabel="sample_驚00";
time=240;
}
if (Input.GetKey(KeyCode.S)) {targetPlayer.mainTimelineLabel="sample_楽00";
time=240;
}
if (Input.GetKey(KeyCode.D)) {targetPlayer.mainTimelineLabel="微笑";
time=240;
}
if (Input.GetKey(KeyCode.W)) {targetPlayer.mainTimelineLabel="考える";
time=240;
}
}
}
ASDWのキー入力に合わせて表情が変わり、しばらく入力が無いと動作リセットをするようになる。
まあ、このままだと非アクティブなときは操作を受け付けないからちょっとアレ。一応、直せるっぽいので今度やります。
終わり。
えもふりでVtuberの真似事をする④ マウスに目線を追従させる
前回までだと棒立ち口パク人形なので、Vtuberらしく動かしてみる。
完全に追従すると動き過ぎてキモいので、割とざっくりとさせるつもりだ。
①前回と同じく、新しいC#scriptを作成し、中身を書き換えて保存。(私自身はプログラマーじゃないので、クソコードしか書けない。書ける人は自分なりに直してほしい。)
今回はTest2で作った。
public class Test2 : MonoBehaviour
{
public EmotePlayer targetPlayer;
public float tilt_X;
public float tilt_Y;
private Vector3 position;
// Start is called before the first frame update
void Start()
{
if (targetPlayer == null)
targetPlayer = this.GetComponent(typeof(EmotePlayer)) as EmotePlayer;
tilt_X=0;
tilt_Y=0;
}
// Update is called once per frame
void Update()
{
position = Input.mousePosition;
if (tilt_X<(position.x-500)/8 && tilt_X<15) tilt_X += 1;
if (tilt_X>(position.x-500)/8 && tilt_X>-15) tilt_X -= 1;
if (tilt_Y<(position.y-300)/15 && tilt_Y<15) tilt_Y += 1;
if (tilt_Y>(position.y)-300/15 && tilt_Y>-15) tilt_Y -= 1;
targetPlayer.SetVariable("face_eye_LR" , tilt_X , 0, 0);
targetPlayer.SetVariable("head_LR" , tilt_X , 0, 0);
targetPlayer.SetVariable("face_eye_UD" , -1*tilt_Y , 0, 0);
targetPlayer.SetVariable("head_UD" , -1*tilt_Y , 0, 0);
}
}
②そろそろ仕様が分かってきた頃。前回と同じく、さっき作ったプログラムをEmote PlayerへAdd Componentする。
③再生を押すと、目線である程度追ってくれる。
あまり角度を傾けると、不自然に見えるので、完全には追従していない。
ちなみに最初はキー入力で操作するように作ったが、ゲーム中に顔がブンブンしてもアレなのでやめた。
えもふりでVtuberの真似事をする③ 声に合わせて口パクさせる
前回までで、とりあえず身内向けのV放送は出来るようになったので、次は口パク機能を実装する。
①Sceneから「LipSynchSetup」を選択する。
※このシーンは元から口パクの機能をサンプルとして例示しているものだが、ボイスサンプルに合わせるようになっているので、マイクの音を拾うように変更したい。
※SDKについていたマニュアル通りにセットアップしても同じこと。
左側、Emote Playerの中にAudio Sourceが存在する。これのInspecterの設定で、AudioClipをNoneに、Loopにチェックを入れる。
これで、デフォルトで入っていた男の人の声は再生されなくなった。
②Scriptsフォルダ内で右クリックしてCreate>C#Script。今回は名前をTestとした。
これをダブルクリックして中身を書き換える。(メモ帳でも適切なエディターでも何でもよい)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
AudioSource aud = GetComponent<AudioSource>();
aud.clip = Microphone.Start(null, true, 10, 44100);
aud.Play();
}
// Update is called once per frame
void Update()
{
}
}
③Audio Source のInspecter下側のAdd Componentを押して、Scriptsからさっき作ったものを選ぶ。これにより、AudioClipの代わりにマイクの音を拾ってくれるようになった。
④再生を行い、マイクでしゃべると、自身の声に合わせて口パクしてくれるようになる。
えもふりでVtuberの真似事をする② とりあえず配置して仲間内でV放送をする
前回の記事でUnity用にエクスポートまでが終了している。
なお、Unityの知識はこれっぽちも必要無い。
①Unityをインストールする。またUnity用のE-moteのSDKをダウンロードする。
https://unity3d.com/jp/get-unity/download
https://emote.mtwo.co.jp/wp-content/themes/StudioE-mote/download/E-mote-SDK-Sample-for-Unity.zip
②UnityでFile>New Projectで空のプロジェクトを作成し、いったん開きなおしてから「emote_sdk_type2.unitypackage」をドラッグアンドドロップでインポートする。
Assets内、Resourcesのemoteに、e-moteでエクスポートしたファイルを入れる。
③SceneフォルダのEmoteLogsをダブルクリックして選択。画面上部の再生ボタンを押すと、カラー表示が可能になる。(毎回必要)
その後、SceneフォルダからBasicSetupを選び、左側でEmote Playerを選択。初期状態ではvr_girlとなっているのを自分が作ったものに選びなおす。
上の再生ボタンを押すと動作。右側Inspecter内のTimelinesでとらせる動作を選択できる。
④UnityCamを導入する。これを導入すると、Unity内のカメラ映像を、背信ソフトで受信できるようになる。
以下でダウンロード。
https://github.com/mrayy/UnityCam
Register.batを実行後、Assets内にUnity Sampleをドラッグアンドドロップ。(batは毎回実行する必要がある?)
左上側でMain Cameraを選択。右側Inspecter内のAdd ComponentからScripts>Unity Cam。これでカメラ映像が受信できるようになった。
⑤カメラの位置調整。
左上でSceneタブを選択し、カメラをドラッグで直感的に操作できる。
右側Inspecter内を操作すれば、背景色などもいじれる。
⑥OBSを導入する。これは配信などに使うアプリである。
起動後、ソースで映像キャプチャデバイスを選択。デバイスからUnityCamを選択。
さらにソースを追加でウィンドウキャプチャやゲームキャプチャでゲーム画面を出す。
これが配信される画面となるので、位置などを微調整。
録画したり配信が可能になった。
⑦試しに身内向けにDiscord配信を行う。
OBS内の編集画面で右クリック。全画面プロジェクターを押すと全画面化する。
DiscordのGoLiveで今フルスクリーン化した画面を選択。
これで配信が出来る。細かい設定はまた今度。