マイコン研究会の日記

大阪市立大学マイコン研究会のブログです。

オンライン授業に向けて~環境は大丈夫? 内蔵マイクは?~ windowsノートPC限定

どうもこんにちは。お久しぶりです。あの、「Popipo's Adventure」を作ったサイキです。文化祭では大勢の方に遊んでいただきありがとうございました。

 

↓↓↓あの、「Popipo's Adventure」↓↓↓

ocumcr.hatenablog.com

 

ところで、最近は新型コロナウイルスが世界中で猛威を振るっており、日本でも感染拡大の防止に伴い外出の自粛などが行われていますね。

 

我らが大阪市立大学も例外ではなく、現在は構内立入禁止、前期いっぱいの授業はオンラインにて提供といった形を取る予定となっています。

 

オンライン授業の形態はどうもいくつかのパターンに分かれるらしく、資料が配布されるだけの授業から、ZOOM等のオンライン会議システムを用いた教師・生徒間で双方向のやり取りが可能な授業まであることが判明しています。

 

資料が配られるだけの授業ならともかく、ZOOMのようなアプリまで使うとなると、マイク環境が必要になってきます。

 

今回はこのマイク環境についての記事となっています。市大生はもちろん、小中高を含めた他の学校、もちろん一般の方の参考にもなれれば幸いです。ただし、この記事はwindowsのノートPC限定ですので注意してください。(他のMac等を使っている人はすみません……)

 

ところで、マイク付きイヤホン等をPCに接続してもイヤホンのマイクが反応してくれない、といった方にも当記事は有用かと思われます。

 

さて、皆さんがお使いのPCについてですが、内蔵マイクは搭載されているでしょうか? 内蔵マイクとは、つまり元からPCの内部に組み込まれているマイクのことです。オンライン授業のためにマイク付きイヤホンを買ったけれど、実はPCにマイクが搭載されていた! なんてことがあるともったいないですからね。きちんと調べておきましょう。

 

内蔵マイクの有無については、PCの仕様を調べれば出てくるかと思いますが、慣れていない方でないとどこにそんな情報があるのか見つけづらいかもしれません。そこで、わざわざ仕様なんて見に行かなくてもマイクが付いているかどうかを確かめる方法を紹介します!

 

まず、右下にあるスピーカーのマークを右クリックして、”サウンドの設定を開く”を左クリックしてください。

f:id:ocumcr:20200415194041p:plain

このマークです

 

続いて出てきたウィンドウを見ていくと、下のような項目が出てくると思います。ここでPCに向かって声を出してみると、”マイクのテスト”の下にあるゲージが動きます。マイクの位置によってはうまく音が拾えない場合があるので、大きめの声を出しておきましょう。手拍子などでも大丈夫です。とにかく音をPCに感知させることが重要なので。

 

ここで、もしゲージが動かなかった場合は内蔵マイクが無い可能性があります。(逆に、ゲージが動いた場合はマイクがあるので安心してください)

 

注意:この時、PCからイヤホンやスピーカー等の音響機器は取り外しておいてください。

 

f:id:ocumcr:20200415193922p:plain

入力の項目を確認

 

さて、次に、イヤホン等(マイク付きでないものを指します)をPCに接続してもう一度同じことをしてみてください。どうですか? ゲージは反応しましたか?

 

PCによってはイヤホンを接続すると内蔵マイクが動かなくなる場合があります。でも慌てないでください、ちゃんと対処法がありますので。

 

もしイヤホン装着時に内蔵マイクが動かなかった場合は、そのイヤホンが勝手にマイク付きイヤホンとして接続されているのかもしれません。

 

そのような場合は、画面左下のwindowsのマークを左クリックしてスタートメニューを表示させてください。そしてメニューをスクロールしていくと、windowsシステムツールというものがあるのでこれを左クリック、そうすると色々出てきますので、中にあるコントロールパネルを左クリックで開いてください。

 

スタートメニュー→windowsシステムツール→コントロールパネル です。

 

次に、出てきたコントロールパネルよりハードウェアとサウンドを左クリック、続いてRealtek HD オーディオマネージャを左クリック、すると下のような画面が出てくると思います。↓

 

f:id:ocumcr:20200416000047p:plain

こんな画面

これの右側にある黒い丸(●←こんなやつです)を"イヤホンをPCに装着した状態"右クリックし、コネクタを再接続しています…を左クリックしてください。すると、下のような画面が出てくると思います。



f:id:ocumcr:20200416001417p:plain

こんな画面です

ここで、このようにヘッドフォン(マイク付き)にチェックが入っている場合は、ヘッドフォンの方にチェックを付け替え、再びマイクのテストをしてみてください。成功すればちゃんとゲージが動くはずです。(逆に、イヤホンについているマイクが反応しないと言う方は、ヘッドフォンの方にチェックが付いている可能性があります)

 

まとめると、

コントロールパネル→ ハードウェアとサウンドRealtek HD オーディオマネージャ→黒丸右クリック→コネクタを再接続しています…→チェックを付け替える

です。

 

では、今回はここまでということで。

これからもマイコン研究会をよろしくおねがいします!

Github Copilotの挑戦

はじめに

新4回生の済木です。今回、個人的に使用申請を出していたGithub Copilotがいつの間にか使えるようになっていたので、これだけでどの程度プログラムが書けるのか簡単に試していこうと思います。本当は去年の11月ごろに使用許可が出ていたけど、つい最近まで気づかなかった。

Github Copilot って?

Github CopilotはGithubとOpenAIの提供するシステムで、人間の書いたコメントや関数名等に応じてその続きのプログラムを提案してくれるものです。例えば、「入力された数値が素数かどうか判定する」といったコメントを記述すると、以下のようにその続きに予想されるプログラムが出力されます。(Github Copilotの予想部分は灰色っぽい文字になっている)

f:id:ocumcr:20220407175502p:plain

上図ではboolまで入力していますが、この程度のプログラムであればほとんど人間が頭を使うこと無く記述できるようになっています。

注意として、結局のところGithub Copilotの予想が正しいのかどうかを確認できるのは人間なので、これを使えば誰でもプログラミングができるようになる!といったものではありません。あくまでCopilot(副操縦士)というわけです。

実践

条件

  • 人間は、関数やクラスの内容をコメントとして日本語及び英語で記述できる。
  • 人間は、関数の返り値の型を記述できる。
  • 人間は、関数の引数を記述できる。
  • 人間は、関数やクラスの名前を記述できる。
  • 人間は、状況に応じて(グローバル、ローカル、メンバ)変数を追加することができる。
  • 人間は、状況に応じて(通常の、あるいはメンバ)関数を追加することができる。ただし、その内容を直接書くことはできない。
  • 人間は、状況に応じてクラスを追加することができる。ただし、その内容を直接書くことはできない。
  • 人間は、状況に応じて適切に開き括弧、閉じ括弧を記述できる。
  • 人間は、状況に応じてヘッダファイルをincludeできる。
  • using namespace std; は記述されているものとする。

①2次元のベクトルを扱うクラスを作る

まず、2次元のベクトルを扱うクラスを作成してみます。

コメント、クラス名、波括弧を入力すると以下のように予想が出力されました。

f:id:ocumcr:20220407181017j:plain

f:id:ocumcr:20220407181020j:plain

お気づきの方もいられるかと思いますが、メンバ変数が宣言されていないためこのままだとプログラムは動きません(おっちょこちょいかな?かわいいね)。privateにメンバ変数を追加してあげましょう。

f:id:ocumcr:20220407181447p:plain

????????????????

メンバ関数で利用している変数名はx_, y_なのに、こっちだとアンダーバーの抜けた変数名が提案されています。いきなりやらかしの多いCopilot君ですが、まぁこのくらいであれば人間の手で簡単に修正できるので問題なしとしましょう。

AtCoder Beginner ContestのA問題を解いてみる

次に、AtCoder Beginer Contest(ABC)のA問題を解かせてみます。ABCはAtCoder社の開催する競技プログラミングのコンテストの中でもっとも初心者向けであり、その中でもA問題は(保証はされていませんが)1番簡単な問題という位置付けになっています。

今回は、ABC 246のA問題Four Pointsの問題文をコメントとして入力することで、どの程度正解に近いコードが出力されるのかを検証してみます。

入力はコメント、main関数の名前です。

f:id:ocumcr:20220407191353p:plain

一見きちんとプログラムが書けているように見えますが、おそらく間違った出力をしてしまいます。とりあえず、iostreamを用意していなかったのでincludeしてから提出してみましたが、結果は案の定WAでした。

上の問題では出力の内容こそ間違っていたものの、入出力の形式を指定していないにも関わらずうまく予想できていたことには可能性を感じます。何かもう1つ問題を解かせてみましょう。

次に試してみるのは、ABC 245のA問題Good morningです。前と同様に問題文をコメントとして入力して、それに対する反応を見ます。結果は以下のようになりました。

f:id:ocumcr:20220407192339p:plain

今回も入出力の形式は守られていましたが、提出してみた結果はWAでした。よく見てみると、プログラム中の条件文が若干間違っています。正しくは、b\lt dではなく b \leq dになるはずです。実際、そのように修正してから提出してみるとACが取れました。

今回は2つの問題についてGithub Copilotを用いて解答を作成していましたが、いずれも正解にはなりませんでした。ただ、両方入出力の部分は正しく書けており、2問目に関してはほとんど正解のプログラムを出力することに成功していました。

不正解のプログラムを出力してしまった原因としては、コメントが日本語であったこと、コメントによる説明が不足していたこと、そもそもGithub Copilotの学習がまだ十分でないことが考えられます。

③何かゲームを作ってみる

最後に、Github Copilotを用いて何かしらのゲームを作成してみます。

ひとまず、ライフゲームでも出力させてみましょう。クラス名を定義すると、以下のように予想を吐き出しました。

f:id:ocumcr:20220407194228p:plain

相変わらずメンバ変数を用意してくれないみたいです。とりあえずここで用意されたメンバ関数の定義を続けて予測させます。

f:id:ocumcr:20220407194401p:plain

f:id:ocumcr:20220407194553p:plain

f:id:ocumcr:20220407194500p:plain

f:id:ocumcr:20220407194622p:plain

f:id:ocumcr:20220407194717p:plain

f:id:ocumcr:20220407194743p:plain

f:id:ocumcr:20220407194809p:plain

f:id:ocumcr:20220407194842p:plain

f:id:ocumcr:20220407194858p:plain

f:id:ocumcr:20220407194928p:plain

ひとまず、メンバ関数とメイン関数については以上です。

ところで、private領域にメンバ変数を用意しようとすると以下のように地獄みたいなことになってしまいました。

f:id:ocumcr:20220407195309p:plain

仕方がないので変数は手入力しました。このくらいであれば人間が頭を使っているとは言えないので大丈夫でしょう。

f:id:ocumcr:20220407200522p:plain

さて、最後にコンパイルして実行してみます。コンパイラはg++(GCC)のversion10.2.0です。

適当に入力を入れた結果、以下のようになりました。

f:id:ocumcr:20220407200940p:plain

見辛い!!!!!

まったく改行やステップ数が書かれていないため、どこが区切りなのかわかりません。さすがにわかりにくいので、手入力で改行を追加しました。また、入力が単純すぎてつまらなかったので、少し複雑にしてやり直してみました。その結果が以下の画像です。

f:id:ocumcr:20220407201413p:plain

ライフゲームのルールはいくつかありますが、update関数の条件を見るとこのプログラムにおいては以下の3つのルールで動作しているようです。

  1. 生きているセルの周囲9マス(自身を含める)に生きているセルが2つか3つあれば生存
  2. 死んでいるセルの周囲9マスに生きているセルが3つあれば誕生
  3. それ以外は死滅

確かに、プログラムで出力された結果はその通りになっているのではないでしょうか?これはGithub Copilotの勝利と言っても過言ではないでしょう。

総評

Github Copilotにいくつかの挑戦をしてもらいましたが。頻繁に記述されるような小プログラムに関してはある程度任せられるかな、といった感想です。

例えば2次元ベクトルの例でも、メンバ変数の名前がおかしいといった不満点はあるものの、その程度であれば人間が必要なものを追記できるはずです。ある程度人間の側がサポートすることを踏まえれば、すでにお遊びを超えて実用的なツールと化していると言えるでしょう。

また、適当なタイミングで予測をさせることで、「なるほど!たしかにこんな関数があればよさそうだな」とプログラマを刺激させる効果も期待できそうです。

まだまだ進化の余地はありますが、活用次第ではプログラミングの質を上げるツールとして十分期待できるでしょう。

ただし最初の方にも書きましたが、これはあくまで補助的なツールであり、完全に任せることはできません。また、予想されたプログラムが本当に正しく動作するのかどうかは、結局人間が判断しなくてはいけません。Github Copilotを活用するためには、最低限同レベルのプログラムを人間が記述できる必要がありそうです。

 

市大の成績発表は 遅 す ぎ る ! 少しだけはやく成績を知る方法

 毎度毎度他大と比べて成績発表が異常に遅い当大学ですが、この時期になると各方面から今期の成績はどうかと心配する声が聞こえてきます。そんな成績ですが、実は正式な発表以前に知る方法があるのです。

 ただし、ここで紹介する方法は正式な成績を確認する方法ではないので、その信憑性は保証されたものではありませんためあしからず。

OCU指標って何?

 いきなりですが、市大にはいわゆる評定平均的なGPAの他に、6つの分野における学習具合を示したOCU指標と呼ばれるものがあり、UNIPAで確認することができます。6つの分野とは具体的に以下の通りです。

  • 論理的思考
  • 情報活用
  • 外国言語・文化
  • 表現
  • 社会貢献
  • 各学部独自

 これらの分野の学習具合がレーダーチャートで表され、今までに受けた授業のバランスがどのようになっているのかを確認することができます。次の履修で何を取るとバランスの良い教養が得られるか、と言ったことがわかるようになっているわけです。

 さて、このOCU指標ですが、その値の計算にはなんと各授業の成績が使われています。また、OCU指標は成績発表の数日前にしれっと公開されるので、これから逆算することで自分の成績を発表の前に割り出すことができるのです!(2021/9/11現在の情報です)

OCU指標の計算方法

 さて、OCU指標の計算方法ですが、実は公表されています。*1

 おおざっぱに説明すると、以下のとおりです。

  • 授業ごとに12のポイントが与えられ、これを各分野に振り分けている。(このポイントがその授業における分野ごとの重みになる)
  • 成績が決まると、(重み\times \mathrm{GP}) / 12で各分野の指標が計算される。

 例えば、ある授業において社会貢献に3ポイント割り振られていた場合、その指標は成績がAAの時1、Aの時0.75(表示は0.8)、Bの時0.5……といった感じになります。

 よって、成績がAAの場合、その授業のOCU指標の和が4になることがわかります。

OCU指標の確認方法、すなわち成績確認

 すでに書いたように、OCU指標はUNIPAより確認できます。UNIPAの上の方にある一覧からOCU指標をクリックして確認画面に遷移しましょう。

f:id:ocumcr:20210911013229p:plain

 さらに、表示単位、年度学期を適切に変更し、以下のように科目ナンバーの上7桁を指定します。

f:id:ocumcr:20210911013312j:plain

 科目ナンバーはUNIPAのシラバス参照から確認することができます。実際には8桁以上あるものが大半(と言うか全部?)ですが、OCU指標の確認画面で指定できるのは7桁までです。そのため、上7桁が被っている授業があった場合はそれらの指標が加算されて表示されるため注意してください。(解消方法は模索中)

 入力項目が大量にありますが、それぞれの行で独立しているため、異なる行に8桁目以降を入力してもうまく動作しません。

 さて、科目ナンバーの入力を終えて表示ボタンを押すと、いよいよOCU指標を確認することができます。

f:id:ocumcr:20210911014243p:plain

 各項目の頂点(チョボになっている部分)にマウスを持っていくとその分野の値が表示されるので、それらを合計することで成績を確認することができます。

 ちなみに、表示される値はおそらく小数2桁目を四捨五入したものなので若干の誤差がありますが、おおよそGPに近い値になるはずです。

おわりに

 改めて書きますが、当記事で紹介した方法は成績を確認するための正式な手順を踏んでいないため、都市伝説に毛が生えた程度のものです。あくまで気休めとして参考程度に利用してください。(あと内容が間違っている可能性もあるので注意してね)

代数系とデータ構造 part1 ~代数系のおさらい~

<注意>
本記事の内容はプログラミングの基礎知識を前提としたものです。一応代数系に関しては記事内にて解説をしますが、難易度については保証できません(なるべく簡単な説明を試みてみます)。また、各代数構造の解説は厳密なものではなく、誤りがある可能性もあるので注意してください。

 

いきなり注意書きから始まってしまい大変申し訳無いのですが、こんにちは、サイキです。

今回は代数系とデータ構造というタイトルの通り、各代数構造とプログラミングにおけるデータ構造との絡み合いについての解説記事となっています。連載記事なので、何部かにわけて投稿する予定ですが、もしかすると最終的には一つの記事にまとめるかもしれません。

読者の想定レベルとしましては、

  1. ある程度プログラミングの知識がある(プログラミングの入門書一冊を読んだ程度、あるいはそれに準ずる授業を受けた程度で十分です)

これだけ満たしていれば、内容を理解できるように書いたつもりですが、最後の解説だけ行列の知識が必要となってくる部分があるので注意してください(他に良い案が思い浮かばなかったのです。本当にすみません……)

わかりやすく大阪市立大学電気情報工学科のカリキュラムに沿った説明を行うと、一回生前期の授業であるプログラミング言語を履修し終えたあたりの学生であれば理解できる内容だと考えています。もちろんこれは授業の理解が前提となっているので、理解度が浅い場合は読解が困難な箇所も考えられます。

また、同じく一回生前期の情報数学内で教わる代数系の範囲も理解していると、より一層読みやすくなるかと思います。

他の学部や学科がどのような授業を受けているのか知識がないので具体的なことは言えませんが、とにかく代数系の基礎知識(群とか環)があれば読むのが楽になると言うことです。

 

 

代数系のおさらい

今回の記事では今後のデータ構造の話をするにあたって大切な代数系のおさらい(あるいは、紹介)をします。初見の人には難しい内容かと思いますし、実際私も学習時には苦しみましたが、実は言っていることは単純なことばかりなので、落ち着いて学んでいきましょう。

マグマ

ある集合Aとその上で定義された二項演算*の組(A,*)について、演算結果が常に閉じている時、この組はマグマであると言えます。

ここで、演算結果が閉じているとは、Aのある二要素x,yについて、その演算結果z=x*yが常にz \in Aであることを指します。

例えば、マグマの例としては(\mathbb{R},+)(\mathbb{R}, \times)などがあげられます(\mathbb{R}は実数全体の集合)

いずれの場合にしても、演算の結果は常に指定された集合の要素に含まれていることが直感的にわかると思うので、厳密な証明はここでは避けます。

逆にマグマでない例としては、(\mathbb{N},\div)があります(\mathbb{N}自然数全体の集合)。適当に2,3と言う数を取ってくると、これら2つは自然数に含まれていますが、\frac{2}{3}自然数ではありません。これは閉じていないと言えるでしょう。

半群

 (A,*)がマグマであり、かつ

結合則 x*(y*z)=(x*y)*z \ |\  x,y,z \in A

が成り立つならば、それは半群であると言えます。もっと簡単に言うと、式中のどこから計算をはじめても結果は変わらないと言うことです。

これからはこのようにどんどんと条件が付け足されていきますが、制約の多い代数構造ほど使い勝手は良くなっていきます。

半群の例としては、先程も登場した(\mathbb{R},+)があります。実際、足し算はどこから計算し始めても問題ないと小中学校で教わったと思います。

逆に半群でない例としては、(\mathbb{R},-)があります。例えば5-3-2と言う計算を行う時に3-2を先に計算してしまうと答えと合わなくなりますよね?これは結合則が成り立っていないからです。

モノイド(単位半群)

(A,*)半群であり、かつx \in A について

e*x=x*e=x

であるような元e \in Aが存在する時、モノイドと言い、この元e単位元と呼びます。

情報数学の授業では単位半群と習ったと思いますが、世間ではモノイドと言う呼び方の方が一般的なのでこちらを使います。

モノイドの例としては、(\mathbb{R},\times)があります。この場合、単位元eは1になりますね。実際、1 \times x=x \times 1=xであることがすぐにわかります。

逆にモノイドでない例としては、(\mathbb{R},min)があります。minは与えられた2要素のうち、小さい方を返却する演算です(min(5,2)ならば2になります)。これに単位元を設定しようとすると、\mathbb{R}の中で最も大きな値をとってくる必要がありますが、そのような値は存在しないので単位元はありません。

(A,*)がモノイドであり、かつ各x \in Aに対して

\overline{x}*x= x* \overline{x}=e

となる\overline{x} \in Aが存在する時、群と言い、\overline{x}xの逆元と言います。ちなみに、この時\overline{x}の逆元はxです。

群の例としては、(\mathbb{R},+)があります。なんか同じやつばっかり出してしまってすみません……

それはさておき、この時の逆元は、x \in \mathbb{R}に対して -xと設定できます。これらの演算結果はいついかなる時でも0になりますよね?(ちなみにですが、ご察しの通りこの時の単位元は0です)

逆に群でないもの例としては、(\mathbb{R},\times)があります。x \in \mathbb{R}に対して\frac{1}{x}を設定すれば良いのでは?と思う方もいるかも知れませんが、それだとx=0の時にうれしくないことが起こります。なのでこれは群であるとは言えません。

ただし、実数から0のみを取り出した集合\mathbb{R}-\{0\}を用いれば群になります。

アーベル群(可換群)

(A,*)が群であり、かつx,y \in Aに対して

可換則: x*y=y*x

が常に成り立つならば、これはアーベル群であると言います(可換群とも言います)

いつもの奴ですが、(\mathbb{R},+)はアーベル群です。式中の数字を好き放題に入れ替えても答えは変わりませんよね?

ここで、アーベル群でないものを説明するために、ちょっと特殊な演算*を定義してあげます。

*:\ \ x*y \rightarrow ax+y\ \ |\ a,b \in \mathbb{R}

とでもしておきましょうか。

群ではあるがアーベル群でないものを説明するとなるとややこしいのですが、比較的簡単なものとして(S,\cdot)(Sは正則行列全体の集合)があります。つまり行列の掛け算です。

証明はここでは省きますが、正則行列同士で掛け算を行った結果は正則行列になりますし、左右どちらに単位行列を掛けても元の行列に戻りますよね?また、正則行列ならば逆行列が存在するので、これは逆元が存在すると言えます。

しかし、一方で、行列の演算は一般的に可換則が成立しません。よってこれはアーベル群ではないのです。

 

終わりに

ひとまず代数系の説明としては以上としておきます。とりあえずこれだけわかっていれば十分です。おまけ程度の説明の中で別の代数構造が必要になってきますが、それに関しては別途解説しますので安心してください。

次回はさっそく本題のデータ構造の話に入っていきますのでよろしくお願いします。

【Unity】カメラワーク入門【Cinemachine】

どうも!fimasuです(`・ω・´)
以前↓の記事を書いて以来なので、ブログを書くのは久しぶりです。
ocumcr.hatenablog.com

さて、今回からは「3Dゲームを作る」というテーマで不定期連載を始めようと思います。
連載できそうになかったためこの記事のみとなりました…

今回はUnityのPackageManagerにあるCinemachineというパッケージを使ってみます。このCinemachineというパッケージは、簡単に言えば仮想カメラを使うことでカメラワークを作成するためのものです。


本記事で使用しているCinemachineは主にver 2.5.0です。
※ Cinemachine ver2.6.3を用いてInputSystemと連携する方法について追記しました。 ※
異なるバージョン(特にこれらより古いバージョン)のCinemachineを用いた場合、動作は保証できませんのでご了承ください。

パッケージのインストール

では、早速インストールしていきましょう!
まずはUnityのプロジェクトを立ち上げていつもの画面にしてください。
開いたら次の画像のようにウインドウからPackageManagerを選択してください。
f:id:ocumcr:20200323213607p:plain

するとPackageManagerの画面が開くので、画像のように選択しInstallボタンを押せばインストール完了です!
f:id:ocumcr:20200323213615p:plain

完了すれば次の画像のようにCinemachine用のメニューが増えます。
f:id:ocumcr:20200404145614p:plain
このメニューからは様々な仮想カメラを作ることができます。

仮想カメラを実際に使ってみる

さて、まずは仮想カメラを使ってカメラワークを作る方法を見ていきます。

準備

カメラで映すものとして動くものが欲しいですよね?
そこで、平面上でキューブを動せるものを準備します。
ヒエラルキータブの+ボタンからオブジェクトを作れるので平面とキューブを作ります。
f:id:ocumcr:20200404150857p:plain
作っただけだとキューブが埋まってしまっているのでCubeを選択してインスペクタから位置を調整します。
f:id:ocumcr:20200404151136p:plain
その後プロジェクトタブの+ボタンからC#スクリプトが作れるので、MoveManagerなど適当な名前を入力してスクリプトを作成します。
f:id:ocumcr:20200404151526p:plain

今回はテストができればよいだけなので、ひとまず次の簡単な移動スプリクトを使うことにしました。

using UnityEngine;

public class MoveManager : MonoBehaviour {

    //移動の速さ
    public float Speed = 3.0f;

    //移動入力保存用
    private Vector3 InputDirection = Vector3.zero;
    
    // Update is called once per frame
    void Update() {

        //入力受付
        InputDirection = Vector3.Normalize(new Vector3(
            Input.GetAxis("Horizontal"),
            0,
            Input.GetAxis("Vertical")));

        //移動処理
        transform.position += Speed * Time.deltaTime * InputDirection;
    } 
}

これを次の画像のようにインスペクタからキューブにアタッチします。
f:id:ocumcr:20200406003959p:plain
これでキューブを動かすことができるようになったのでテストしていきます。

仮想カメラの設定

とりあえず、一番単純な仮想カメラであるVirtualCameraを試してみましょう。
上述のメニューからVirtualCameraを作成すると次の画像のようになると思います。
f:id:ocumcr:20200406004002p:plain
このVirtualCameraを選択し、インスペクタからFollowとLookAtに先ほどのキューブをアタッチします。
f:id:ocumcr:20200409184000p:plain
これで設定完了です!
再生してみるとWASDまたは矢印キーでキューブを動かすことができ、それにカメラが自動でついてくると思います。これが仮想カメラを使うための基本の手順です。
ね?便利でしょう?

仮想カメラの設定の紹介

インスペクタからBodyやAimの設定を変更することで仮想カメラの挙動を変更できます。どんなものがあるか簡単に紹介しておきます。

Body
Transposer系 Followターゲットに追従する
Hard Lock to Target Followターゲットからの位置を固定する
Tracked Dolly 特定の経路(パス)の上のみを動く
Do Nothing 自動では移動を行わない


Transposer系のBodyには純粋なTransposerの他にFraming TransposerとOrbital Transposerがあります。これらは次のような挙動の違いがあります。

Transposer 単純にFollowターゲットに追従する。VirtualCameraのデフォルト設定。
Framing Transposer 主に2Dゲームのカメラ用の設定。カメラが動くアルゴリズム
  1. カメラのX-Y平面から設定した距離にFollowターゲットが来るまでカメラをZ軸に沿って移動させる。
  2. カメラのX-Y平面内で、カメラの画面上の設定した位置にFollowターゲットが来るまでカメラを移動させる。
という感じ。LookAtターゲットを無視するので注意が必要
Orbital Transposer Followターゲットを中心とした円周上にカメラが来るように追従する。その際Heading(向いている方向)にカメラの向きを合わせる。(デフォルトではターゲットの真後ろに来るようになっている)また、ただ追従するだけでなく、ユーザーの入力に応じてFollowターゲットを中心にカメラを回転させることもできる。
Aim
Composer系 LookAtターゲットの方を向く
Same As Follow Target LookAtターゲットとローテーションを一致させる
Hard Look At LookAtターゲットをカメラフレームの中央にあわせる
POV ユーザーの入力に基づいて仮想カメラを回転させる
Do Nothing 自動では回転を行わない

Composer系のAimには純粋なComposerの他にGroup Composerがあります。これらは次のような挙動の違いがあります。

Composer 単純にLookAtターゲットの方を向く。VirtualCameraのデフォルト設定。
Group Composer LookAtターゲットがCinemachineターゲットグループの場合はターゲットグループに指定したものがうまく映るように調整する。

InputManager以外の入力システムを用いたい場合

Cinemachine ver2.5系の場合

仮想カメラのAimをOrbital TransposerやPOVなどに設定した場合、カメラを動かすためにユーザーの入力を使うことがあります。デフォルトでは仮想カメラは、この入力を扱う仕組みとしてUnityの標準(だった)InputManagerを用いるような設定となっています。そのため、InputManagerを無効にすると当然ですがユーザーの入力を使うタイプの仮想カメラは上手く動きません。
つまり、InputManager以外の入力システムを用いたい場合(例えば、Unityの新しい入力システムのInputSystemや、自作した入力システムを使う必要がある時)には一部の仮想カメラが使えないことになります。

※2020/9/26 InputSystemを用いたい場合について追記※

ここでの説明にはCinemachine ver2.6.3及びInputSystem ver1.0.0を用います。
InputSystemを用いる場合はInputManagerを無効にしないことも可能ですが、今回は無効になっているものとして説明していきます。
なお解説は上記の内容を前提知識とし、Cinemachine ver2.6.3及びInputSystem ver1.0.0のインストールが完了しているという前提で書いています。

次の画像のようにプロジェクト設定を開いてください。
f:id:ocumcr:20200924000339p:plain
開くと次の画像のようになると思います。
f:id:ocumcr:20200924001112p:plain
そこでスクロールしていくと「使用中の入力処理*」の項目があると思いますが、これが画像のように「入力システムパッケージ(新)」となっていればOKです。
f:id:ocumcr:20200924001121p:plain
また、「入力マネージャー(旧)」になっている場合はInputSystemが無効なので設定を変えてください。もし「両方」の場合はInputSystem自体は有効なので一応動くとは思いますがあまりオススメはしません。
その後、Input System Packageのタブに切り替えてください。切り替えると次の画像のようになっていると思います。
f:id:ocumcr:20200924002826p:plain
この画面にあるCreate settings assetボタンを押すとInputSystem.inputsettingsというアセットが自動生成され、次のようにInputSystemの設定画面が開きます。
f:id:ocumcr:20200924005659p:plain
そして次の画像のようにSurpported Devicesを追加します。
f:id:ocumcr:20200924010021p:plain
今回は次の画像のようにキーボードとマウスを追加しました。
f:id:ocumcr:20200924010219p:plain
次に、「どの入力をどのようなデータとして受け取るか」の設定を行います。
プロジェクトのタブの+ボタンからInputActionsを選択し、MyControlなどと適当な名前を入力してファイルを生成します。
f:id:ocumcr:20200924011458p:plain
f:id:ocumcr:20200924012423p:plain
ファイルが生成できると次の画像のようになっていると思います。
f:id:ocumcr:20200924012541p:plain
そうしたらGenerate C# Classにチェックを入れ「適当する」ボタンを押してからEdit assetボタンを押します。
f:id:ocumcr:20200924013743p:plain
すると次の画像のような画面が開くと思います。これが入力の設定画面です。
f:id:ocumcr:20200924013945p:plain
その後、一番左側のActionMapsの欄の+ボタンを押して次の画像のようにPlayerやCameraなどと適当な名前を付けてAction Mapを二つ作成します。
f:id:ocumcr:20200924014633p:plain
そして、ActionMapsがCameraの方になっていることを確認した上で、真ん中のActionsの欄に初めからあるActionの名前をLookなどの適当な名前に変え、一番右のPropertiesの欄のAction Typeを「値」に変更します。
f:id:ocumcr:20200924015351p:plain
そうしたら新たにControl Typeの項目が増えるのでこれを「Vector2」に設定します。
f:id:ocumcr:20200924015720p:plain
これで入力をVector2型のデータとして受け取ることが設定できたことになります。ここで、「どんなデバイスが使える環境を想定しているか」の設定を行います。
次の画像のように画面左上の「No Control Schemes」とある所からAdd Control Scheme... を選択してください。
f:id:ocumcr:20200924072613p:plain
すると次の画像のようなメニューが開くのでKeyboard&Mouseなどと適当な名前を入力します。
f:id:ocumcr:20200924072630p:plain
その後、次の画像のように「リストは空です」とある所からKeyboardとMouseを追加します。
f:id:ocumcr:20200924072650p:plain
追加したら次の画像のようになっていると思うのでSaveボタンを押してください。
f:id:ocumcr:20200924072706p:plain
これで「どんなデバイスが使える環境を想定しているか」の設定が終わりました。次は、入力を割り当てていきます。Actionsの欄のLookなどと名付けたアクションの左側の▽印をクリックし、下に新たに出てくる「 <No Binding> {GROBAL} 」となっているところを選択すると次の画像のようになると思います。
f:id:ocumcr:20200924073159p:plain
その後、Pathの項目を選択し次の二つの画像のようにMouseのDeltaを選択します。
f:id:ocumcr:20200924075134p:plain
f:id:ocumcr:20200924075149p:plain
選択し終わったら忘れないうちにUse in control schemeの項目のKeyboard&Mouseにチェックを入れておきます。ここまで終わったら次の画像のようになっていると思います。
f:id:ocumcr:20200924075201p:plain
これでマウス操作の入力をVector2型のデータとして受け取るように設定できたことになりますので上部のSave Assetボタンを押して保存してください。
同様にしてキーボードのWASDをVector2型のデータとして受け取るように設定します。ActionMapsをPlayerの方に切り替え、Actionsの欄に初めからあるActionの名前をMoveなどの適当な名前に変え、Propertiesの欄のAction Typeを「値」に変更します。その後Control Typeの項目を「Vector2」に設定し、忘れないうちにUse in control schemeの項目のKeyboard&Mouseにチェックを入れておきます。ここまで行うと次の画像のようになっていると思います。
f:id:ocumcr:20200925003825p:plain
次はActionsの欄のMoveなどと名付けたアクションの左側の▽印をクリックすると新たに下に「 <No Binding>」となっているものが出てきますが、今回はこれを右クリックして出てくるメニューから次の画像のように削除します。
f:id:ocumcr:20200925005126p:plain
その後Move右側の+ボタンを押して次の画像のようにAdd2DVectorCompsiteを選択し、できたものにWASDなど分かりやすい名前を付けておきます。
f:id:ocumcr:20200925013041p:plain
f:id:ocumcr:20200925013058p:plain
そうしたら新たに下に「Up」「Down」「Left」「Right」が出てきますがこれらを選択するとPathの項目があるので、それぞれに対応するキーを割り当てます。その際、Listenボタンを押せば入力したキーを候補として挙げてくれるので簡単に設定できます。これらを設定し終えると次の画像のようになります。
f:id:ocumcr:20200925013852p:plain
これでキーボードのWASDをVector2型のデータとして受け取るように設定できたことになりますので上部のSave Assetボタンを押して保存し設定画面を閉じてください。
次は動作確認のために一番単純な仮想カメラであるVirtualCameraをBody:Orbital Transposer, Aim:Composerの設定にしたものを使います。なお、上述のものと同様にキューブと平面を作成し、仮想カメラのFollowとLookAtにキューブを設定しておきます。ここまですると次の画像のようになっていると思います。
f:id:ocumcr:20200925233431p:plain
その後、仮想カメラ(画像では CM vcam1 という名前のオブジェクト)のインスペクタをスクロールしていくとコンポーネントを追加というボタンがあるので、ボタンを押して、スクリプト -> Cinemachine -> Cinemachine Input Provider の順で選択します。これによって次の画像のように仮想カメラにCinemachine Input Providerというコンポーネントが追加されます。
f:id:ocumcr:20200925234135p:plain
このコンポーネントによってCinemachineの仮想カメラとInputSystemが連携できます。このコンポーネントのXY Axisのところをクリックすると画像のように先ほど作ったLookなどと名付けたアクションが設定できるのでこれを設定します。これで再生すると仮想カメラを左右に回転させることが可能になっていると思います。(但し、上述したスプリクトのようにInputManagerを使用したスプリクトをアタッチしたままだとエラーが出ると思うので気をつけてください。)
f:id:ocumcr:20200925235832p:plain
また、上述したテスト用の移動スプリクトは次のように直すことで先ほど作ったMoveなどと名付けたアクションに対応して移動するスプリクトに直すことができます。

using UnityEngine;
using UnityEngine.InputSystem;

public class MoveManager : MonoBehaviour, MyControl.IPlayerActions {

    MyControl.PlayerActions input;
    private Vector3 InputDirection = Vector3.zero;

    public float Speed = 3.0f;

    // Awakeのタイミングでコールバックの登録をしておく
    void Awake() {
        input = new MyControl.PlayerActions(new MyControl());
        input.SetCallbacks(this);
    }

    // 有効化されたらインプットも有効化
    void OnEnable() => input.Enable();

    // 無効化される、または破壊されるときにインプットも無効化
    void OnDisable() => input.Disable();
    void OnDestroy() => input.Disable();


    void Update() {
        transform.position += Speed * Time.deltaTime * InputDirection;
    }

    public void OnMove(InputAction.CallbackContext context) {
        Vector2 vec = context.ReadValue<Vector2>();
        InputDirection.x = vec.x;
        InputDirection.z = vec.y;
    }
}

このように直した移動スプリクトをキューブにアタッチして再生するとWASDキーでキューブを動かしすことができ、カメラがそれに追従します。

仮想カメラの種類の紹介

Cinemachineで追加される仮想カメラには次の表のようにいくつか種類があります。

VirtualCamera 一番単純な仮想カメラ。
FreeLookCamera BodyがOrbital Transposerの仮想カメラでできた「リグ」を三つ持っており、これを上段のリグ、中段のリグ、下段のリグとして使用する。この三つのリグをブレンドすることでTPSカメラのように働く。
Blend List Camera 仮想カメラを切り替えていくためのリストを持っており、時間経過とともにそのリストに従って仮想カメラを切り替える。
State-Driven Camera Animatorの状態遷移に応じて仮想カメラを切り替えるもの
Clear Shot Camera 障害物に隠れてターゲットが見えなくなってしまうのを防ぐように仮想カメラを切り替える。
Mixing Camera 複数の仮想カメラをミックスして中間の位置、角度からターゲットを映す。

今回はこの中から私が個人的にオススメのFreeLookCameraを紹介します。
これを使うことでTPSカメラをとても簡単に作ることができます。
先ほどと同様にメニューからカメラを作成してFollowとLookAtに先ほどのキューブをアタッチすると次の画像のようになります。
(画像では先ほど作ったVirtualCameraは削除しています。)
f:id:ocumcr:20200411013844p:plain
シーン画面を見るとわかりやすいのですが、FreeLookCameraはターゲットを中心に回転するようにカメラが追従するもので、動く範囲は三つのリグで決まります。
f:id:ocumcr:20200411015130p:plain
また、各リグごとにBodyとAimがありますが、Bodyは仕様上Orbital Transposerで固定されています。
特に何もせずともこの時点で十分TPSカメラとして使うことができますが各リグの半径やターゲットからの高さを設定することでより使い勝手が良くなります。
Aim内のTracked Object Offset を変更することでカメラの追従する位置をズラしたり,ScreenXやScreenYを変更することで画面のどの位置に表示するかを変更したりするのも良いと思います。



他にもCinemachineには仮想カメラの機能を追加する拡張機能(カメラを振動させるエフェクトをかけるなど)などの便利な機能がたくさんあります。
Cinemachineを使いこなせば、もうカメラワークに悩まされずに済みますね!

銀杏祭2019出展タイトル紹介『Popipo's Adventure』

はじめまして! 一回生のサイキです!

銀杏祭二日目終了後と遅くなりましたが、今回は僕が作ったゲームの紹介をしていこうと思います!

 

 僕が作ったゲームはこちら

f:id:ocumcr:20191102215445p:plain

この記事のタイトルにも書かれている、『Popipo's Adventure』です!(つづりが間違ってるのは触れないで……泣)

初めて作った2Dアクションゲームということで個人的にかなり気に入ってますので、みなさんもぜひプレイしてみてください!

ドット絵はすべて自作のもので、視力と精神力を引き換えにアニメーションも付けています。

ちなみに、815教室の一番右にあるPCでは、アーケードコントローラーを利用してプレイすることもできます。ジョイコントローラーで移動、1番のボタンでジャンプ、5番のボタンで攻撃と決定となっているので、アーケード風に遊んでみたい方はそちらでどうぞ!

銀杏祭2019出展タイトル紹介 『Mokota can be The Virus Killer』

はじめまして(*`・∀・)ノ 一回生のfimasuです

銀杏祭も二日目となりました。引き続き盛り上がっていきましょう!

 

さて、今回は僕の作ったゲーム『MOKOTA CAN BE THE VIRUS KILLER』を紹介させていただきます!(でも、タイトルがちょっと長すぎたのでゲームセレクト画面では便宜上『TPSもこた』となっています(笑))ゲーム『MOKOTA CAN BE THE VIRUS KILLER』のタイトル画面

マイコン研究会のマスコットのもこたがサイバーな空間で敵(ウイルス)をやっつけるという感じのゲームです。ゲームの種類でいうとTPSとなっていて敵のコアをすべて破壊すればクリアとなります。(コアはこんな感じです↓ 敵のスポナーでもあります)f:id:ocumcr:20191102091937p:plain

 右下には簡易レーダーがついていてある程度敵の位置が分かりますが、敵は床をすり抜けてくるので要注意です。

 

f:id:ocumcr:20191102093322p:plain

このゲームではある程度地面から離れた空中であれば小さい足場を生成することができるので空中を飛び回りながら移動することができます(足場は時間で消えるので少しコツがいります)

 

このほかにも目の前に防御用の壁を張ることができたり敵が(二種類しかいませんが....)ちょっと変わっていたり(?)しますのでぜひ自分の目で確かめてみてください。(難易度は少し高めなので操作説明を見ておくことをオススメします。)

 

ご来場お待ちしております!!