Unity備忘録18頁目「ゲーム的な処理を作る1」

江上宿六です。

 

前回はシーン上にあるオブジェクトを探して代入し、違う所にアタッチされた

スクリプト内で処理を行うといった事をしてUIの書き換えをやってきましたが

こういうのはUnity独特なやり方という印象ですけど、実際はどうなんでしょうね。

 

では今回の作業ですがその前に、オブジェクトの高さを調整しましょう。

PlaneやCube、カメラやライトのYに5を加えます。 また、SphereGeneratorの

スクリプト内での生成する高さにも5加えます。 これでPlaneの初期高さが5になり

ゲームの初期状態が作る事が出来ました。 無計画だからこうなります。

f:id:y6yegami:20180721114038p:plain

ちゃんと高さが5になっていて、UIが正しく動作している事も確認できました。

 

さて、とりあえず次はスコアを部分に手を付けましょう。 スコアが加算される

タイミングはSphereが破棄される時にし、また、落ちた地点がPlaneから

遠いほどスコアが多く貰えるという風にしてみます。 固定でも良いですけど。

ではまずはGameDirectorスクリプトを編集します。

f:id:y6yegami:20180721160227p:plain

スコアを加算する関数を作りましたが、これはpublicで宣言しています。

こうする事で外部からこの関数を呼ぶことが出来るようになるわけです。

ではこれを呼び出す側のSphereControllerスクリプトを編集します。

f:id:y6yegami:20180721155250p:plain

GameObjectのgameDirectorとplaneを宣言し、Startでそれぞれ代入しました。

前回やった感じの処理ですね。 次に破棄する処理の所です。

f:id:y6yegami:20180721162205p:plain

まぁ、非常に横長になってしまってますが、transform.positionだったのは

Rigidbodyにするように変更しました。 それとどうやら書き方が古かったと

警告が出たので、参照のしかたも少し変えてみました。

 

そこはともかくとして、ベクトルを宣言してやたら長い代入式を書いています。

こうなってしまったのは、高さがスコアというかベクトルの長さに与える影響が

大きかったので、高さを排除するためにy座標を抜いたベクトルを参照して

新たに距離を測れるベクトルを作ろうとしたわけです。

 

そしてgameDirector.GetComponent<GameDirector>().AddScore~、とあります。

前回もやりましたが、gameDirectorにアタッチされているGameDirectorの

スクリプトにあるAddScoreを呼び出しているという感じです。 送っている

(int)vec.Magnitudeというのはベクトルの長さです、int型にキャストしています。

f:id:y6yegami:20180721164042p:plain

実行して色々と操作してみると、Sphereが破棄されるとスコアが加わり、

また、距離によってスコアが変わるのが確認出来ると思います。 やや数字が

小さいので、得られるスコアを2乗してみても良いかもしれないですね。

 

という感じで今回は終わりですが、どうせならAddScore関数をpublicにするより

gameScoreの方をpublicにすれば良いんじゃないかと思うかも知れませんし、

最初はそういう風に書こうとしていましたが、なんとなく直感でそれは駄目だと

思ったのでこんな感じになりました。

 

次回はSphereの接地数によってPlaneが落下していく処理をやりたいのですけど

その前に一つ対処したい問題がありまして、そっちを優先したいと思います。