SteamVRをつかってUNITE IN THE SKYのなかに入るまで
まえがき
夏くらいに某大学のオープンキャンパスにいったらQuestで動かしてるのをみて大晦日の暇つぶしに作りました。
使用環境
- Unity 2019.2.17f1
- SteamVR 1.9.16
- OculusSoftware(12.1)[Oculus Rift Sの動作用です。Vive等は不要だと思います]
- SteamVR Plugin(2.5.0)
- ユニティちゃんライブステージ(1.0)
手順
ライブステージの設定
落としてきたライブステージのAssets/Scenes/Mainを開く。
Stage Director(オブジェクト)のAnimatorのUpdate ModeをNormal から Unscaled Timeに変更。なぜかは後述
CandyRockStar(Prefab)を探し出してAnimatorのUpdate ModeをこちらもNormal から Unscaled Timeに変更
LipSyncControllerも探し出して(ry
SteamVR Plugin側の設定
Accepted All で大丈夫
MainのHierarchyにAssts/SteamVR/Prefabs/[CameraRig]を放り込む
ユニティちゃんが0,0,0で踊るのでCameraRigの向きを反転させたり、距離をいじったりする。(私はPosition Z:3.0,Rotatom:Y180に変更しました)
最初に起動するとこんなのとかが出てくるけども基本的にYes。
SteamVR InputもSave and generateでOK。
終了!
あとはWindows用にBuildするなりご自由にどうぞ。
ハマったとこ
裏画面とかに行くとAnimatorがずれる!!
AnimatorのUpdate ModeをUnscaled Timeにすることで解決。ただし、一定に設定されるから、等倍のみになる。
あとがき
動かすためだけに作ったけれども、Unityで時間加速とかの方法を知るきっかけになってよかった。あとユニティちゃんかわいい 今回はSteamVRメニュー開いたりしてもずっと続けるようにしているけど、一時停止とかできるようにしたい
Licence表記
この作品はユニティちゃんライセンス条項の元に提供されています
ABC149(unrated)の参加記
A問題 Strings
そのまま。問題文読んで順番気をつければいい。
#include<bits/stdc++.h> using namespace std; int main(){ string s,t; cin >> s >> t; cout << t << s << endl; return 0; }
B問題 Greedy Takahashi
問題文から考えられるのは以下の3通り
- 高橋くんも青木くんも食べ残す
- 青木くんだけ残る
- 高橋くんに食べ尽くされる
だからそれを場合分けして書いた。
制約が1012までであることに注意
#include<bits/stdc++.h> using namespace std; typedef long long ll; int main(){ ll a,b,k; cin >> a >> b >> k; //場合分け if(k <= a){//高橋くんも青木くんも余る a -= k; cout << a << " " << b << endl; }else if (k >= a+b)//青木くんだけ余る { cout << 0 << " " << 0 << endl; }else{//食べ尽くされる cout << 0 << " " << (a+b)-k << endl; } return 0; }
C問題 Next Prime
どこからか素数の判定する関数持ってきてfor回すだけ
#include<bits/stdc++.h> using namespace std; bool IsPrime(int num)//素数だけ数えればいいから { if (num < 2) return false; else if (num == 2) return true; else if (num % 2 == 0) return false; // 偶数はあらかじめ除く double sqrtNum = sqrt(num); for (int i = 3; i <= sqrtNum; i += 2) { if (num % i == 0) { // 素数ではない return false; } } // 素数である return true; } int main(){ int x; cin >> x; for(int i=x;;i++){ if(IsPrime(i)){ cout << i; break; } } return 0; }
D問題 Prediction and Restriction
今回は勝ったときだけポイントが入って、あいこと負けは0ポイントであるとこと、問題文が貪欲法を押している気がしたので貪欲法で書いてます。多分。初めて書いた貪欲法なのでこれが貪欲法なのか怪しいです。
k回前と同じ手をだせないということで何を出しても0ポイントで、2k回目のときにkで置き換えたものと同じになったときに面倒なので、あり得ない文字を結果に入れてます。
int型からあふれるのに気づかないで2WA出したのが残念。
#include<bits/stdc++.h> using namespace std; typedef long long ll; char janken(char c){ if(c == 'r'){ return 'p'; }else if (c == 's') { return 'r'; }else if(c == 'p'){ return 's'; }else{ return 0; } } int main(){ ll n,k,r,s,p; cin >> n >> k >> r >> s >> p; string t; cin >> t; vector<char> result; ll total_score = 0; for(int i=0;i<n;i++){ if(i < k){//k回まで result.push_back(janken(t[i])); if(janken(t[i]) == 'r'){ total_score += r; }else if (janken(t[i]) == 's') { total_score += s; }else{ total_score += p; } }else{ if(janken(t[i]) != result[i-k]){ result.push_back(janken(t[i])); if(janken(t[i]) == 'r'){ total_score += r; }else if (janken(t[i]) == 's') { total_score += s; }else{ total_score += p; } }else{ result.push_back('0'); total_score += 0; } } } cout << total_score; return 0; } /* やっほい! やほほい! + * ∧∧ . ∧∞∧ * * ヽ(=´ω`)人(´ω`*)ノ .~( O x.) ( O)~ + 。* ∪ ∪ */
今回の感想
なんか簡単と言われた前回のABCより解けました。というより初Dだったので嬉しかったのですがratedだったらもっと嬉しかったです。
JOI2019/2020 一次予選第三回 C問題解説
問題文
長さNの正整数列A=(A1,A2,…,AN)が与えられる.正整数列Aの連続部分列の中で昇順に並んでいるもののうち,最長のものの長さを求めよ. すなわち,Al≦Al+1≦⋯≦Ar 満たすような2つの整数l,r (1≦l≦r≦N)について,r−l+1 の最大値を求めよ.
制約
1≦N≦100 1≦Ai≦2020 (1≦i≦N)
入力
N A1 A2⋯AN
※問題文、制約、入力の情報は日本情報オリンピック委員会に帰属し、CC4.0 BY-SAで提供されています。 また本記事はCC4.0 BY-SAを継承しています
解説
数列が与えられるからこのときforループで入力を取る。(以下for(int i=0;i<N;i++){}のループを指す)
このときに判断するとコードが短くて済む。
出力される数字は1以上だということに注意。
変数
int S,N,cnt,ans;
cntとansはそれぞれ1で初期化している。
- if文でiが0でないこと、かつi-1はiよりも小さいかについて評価する。
- 上が真のとき、cnt(現時点で数字が続いている数)に+1する
- ans <= cntのときcnt に ans を代入
- cnt に 1を代入する。
- 上が真のとき、cnt(現時点で数字が続いている数)に+1する
問題文より、連続する数がない場合でも1個連続しているとなるから答えは1以上である。
#include<bits/stdc++.h> using namespace std; int main(){ int N,A[100]; cin >> N; int ans=1,cnt=1; for(int i=0;i<N;i++){ cin >> A[i]; if(i != 0 && A[i-1] <= A[i]){ cnt ++; if(ans <= cnt){ ans = cnt; } }else{ cnt = 1; } } cout << ans; }
JOI2019/2020 一次予選第三回 B問題解説
キャピタリゼーション
問題文
JOI 君は長さNの文字列 S を見つけた. S に含まれる文字はすべて英小文字である. JOI 君はこの文字列から自分の名前である'joi'が連続している部分を先頭から順にすべて探しだすことにした.そして' joi'を見つけるたびに,強調のためにそれを大文字の'JOI'に置き換えることにした.
文字列S が与えられたとき,S に含まれる' joi' をすべて 'JOI 'に置き換えた文字列を出力するプログラムを作成せよ.
制約
3≦N≦100 Sは長さNの文字列である. Sは英小文字からなる.
入力
N S
※問題文、制約、入力の情報は日本情報オリンピック委員会に帰属し、CC4.0 BY-SAで提供されています。また本記事はCC4.0 BY-SAを継承しています。
解説
ループを回して、ループごとにif文で文字がj,次がoか,つその次がiであるかどうかを確認する。
ループブロック中でif文を抜けた後にS[回数]を出力すると短くできる。
ACコード
#include<bits/stdc++.h> using namespace std; int main(){ int N; string S; cin >> N >> S; for(int i=0;i < N;i++){ if(S[i] == 'j' && S[i+1] == 'o' && S[i+2] == 'i'){ S[i] = 'J'; S[i+1] = 'O'; S[i+2] = 'I'; } cout << S[i]; } }
JOI2019/2020 一次予選第三回 A問題解説
X に最も近い値 (The Nearest Value)
問題文
整数X,L,R が与えられる. L以上R以下の整数のうち, Xとの差の絶対値が最も小さいものを出力せよ. そのような整数はちょうど 1 つだけ存在することが証明できる.
制約
1≦X≦100000. 1≦L≦R≦100000.
入力
入力は以下の形式で標準入力から与えられる
X L R
※問題文、制約、入力の情報は日本情報オリンピック委員会に帰属し、CC4.0 BY-SAで提供されています。 また本記事はCC4.0 BY-SAを継承しています。
解説
入力される数字は次の3つに場合分けされる。
X < Lのとき Lの値を出力する L ≦ X≦ Rのとき Xの値を出力する R < Xのとき Rの値を出力する
ACコード
#include<bits/stdc++.h> using namespace std; int main(){ int X,L,R; cin >> X >> L >> R; if(X < L){ cout << L; }else if(L <= X && X <= R){ cout << X; }else{ cout << R; } }