江上宿六です。
前回はシーン上にあるオブジェクトを探して代入し、違う所にアタッチされた
スクリプト内で処理を行うといった事をしてUIの書き換えをやってきましたが
こういうのはUnity独特なやり方という印象ですけど、実際はどうなんでしょうね。
では今回の作業ですがその前に、オブジェクトの高さを調整しましょう。
PlaneやCube、カメラやライトのYに5を加えます。 また、SphereGeneratorの
スクリプト内での生成する高さにも5加えます。 これでPlaneの初期高さが5になり
ゲームの初期状態が作る事が出来ました。 無計画だからこうなります。
ちゃんと高さが5になっていて、UIが正しく動作している事も確認できました。
さて、とりあえず次はスコアを部分に手を付けましょう。 スコアが加算される
タイミングはSphereが破棄される時にし、また、落ちた地点がPlaneから
遠いほどスコアが多く貰えるという風にしてみます。 固定でも良いですけど。
ではまずはGameDirectorスクリプトを編集します。
スコアを加算する関数を作りましたが、これはpublicで宣言しています。
こうする事で外部からこの関数を呼ぶことが出来るようになるわけです。
ではこれを呼び出す側のSphereControllerスクリプトを編集します。
GameObjectのgameDirectorとplaneを宣言し、Startでそれぞれ代入しました。
前回やった感じの処理ですね。 次に破棄する処理の所です。
まぁ、非常に横長になってしまってますが、transform.positionだったのは
Rigidbodyにするように変更しました。 それとどうやら書き方が古かったと
警告が出たので、参照のしかたも少し変えてみました。
そこはともかくとして、ベクトルを宣言してやたら長い代入式を書いています。
こうなってしまったのは、高さがスコアというかベクトルの長さに与える影響が
大きかったので、高さを排除するためにy座標を抜いたベクトルを参照して
新たに距離を測れるベクトルを作ろうとしたわけです。
そしてgameDirector.GetComponent<GameDirector>().AddScore~、とあります。
前回もやりましたが、gameDirectorにアタッチされているGameDirectorの
スクリプトにあるAddScoreを呼び出しているという感じです。 送っている
(int)vec.Magnitudeというのはベクトルの長さです、int型にキャストしています。
実行して色々と操作してみると、Sphereが破棄されるとスコアが加わり、
また、距離によってスコアが変わるのが確認出来ると思います。 やや数字が
小さいので、得られるスコアを2乗してみても良いかもしれないですね。
という感じで今回は終わりですが、どうせならAddScore関数をpublicにするより
gameScoreの方をpublicにすれば良いんじゃないかと思うかも知れませんし、
最初はそういう風に書こうとしていましたが、なんとなく直感でそれは駄目だと
思ったのでこんな感じになりました。
次回はSphereの接地数によってPlaneが落下していく処理をやりたいのですけど
その前に一つ対処したい問題がありまして、そっちを優先したいと思います。