LINQを使ってみる
というのを前から知っていたのですが、使う機会がなく半年くらいそのままでした。
しかし先日に後輩からUniRx便利ですよっ!!ってめっちゃ押されたので調べてみた。
便利そうですね(小並)。
マウスのダブルクリックとか値を監視してイベントの発生とかしてくれるのはよさそう。Reactive Extensionsっていうらしい。
けれども、私は知識として前提条件のLINQを何も知らない!!ということでとりあえず触ってみることにしました。
まずは資料をネット探して、読んで同じ問題を解いてみました。
Unityで書いてます。(調べたとき丁度Unityを開いていたので)
まずは、最初に普通にコードを書いてみて
外部に数列生成部分を分けてみる。
それをLINQで取得するようにしてみる。
・・・とりあえず完成。
GetNaturalNamberからTakeWhileで条件を満たすものだけをWhereに流して、Whereで問題にそった3と5の倍数のみを取り出してSumで合計する。
ってことでいいのでしょうか。
書いてある事だけじゃ写経になってしまいますのでProject Eulerから問5を解いてみました。わざわざLINQ使ってすることではないのは分かっていますが、学習用ということで…w
もうチョイ抽出条件綺麗に書きたいなって感想しかない・・・
書き方は分かりました。が、ラムダ式とかまだ知らないことがさらに見つかったのでまだまだ覚えるべきことはありますね。
他の人の役には立たないけど、備忘録ということで今回の記事です。以上。
Photon Unity Networkingを試してみる(続き)
前回の記事の続きです。
前回の記事ではLerpで移動を行っていたため、同期のズレが目立ちました。
そこで公式で最もスムーズとされているSynchronize Valueを使ってみます。
まずはコードを書き直しましょう。
追加したのは this.GetComponent<PhotonTransformView>().SetSynchronizedValues(speed: move, turnSpeed: 0);
です。
SetSynchronizedValues(Vector3 speed,float turnSpeed)で速度と回転速度を修正、同期された値の更新を行います。
これでビルドをするとこんな感じに。
だいぶ滑らかに、リアルタイムに同期できているのではないでしょうか?
明日か明後日にはアニメーションの同期をやりたいと思います。
Photon Unity Networking 1.5 を試してみる
Unityでネットワークを簡単に実装する方法としてPhotonがよく使われています。
ネットワーク処理を殆ど書かずにリアルタイム通信ゲームが作れる優れものです。
ただ、色々なサイトでPhotonの記事が書かれているのですが、1.5の記事をあまり見かけなかったので自分で作ってみることにしました。
まずはPhoton Unity NetworkingをダウンロードしてUnityにインポート。
次にシーンを新しく作成して、空のゲームオブジェクトを作成してオブジェクト名をNetworkManagerにしてください。
Scriptフォルダを作成しNetworkManager.csを作成、開いてください。
さて、このNetworkManagerにはオンライン対戦でよく使われるルームの作成、ルームへの入場等を行ってもらいます。
このスクリプトのPlayerMake()でプレイヤーとなるゲームオブジェクトをInstantiateします。このオブジェクトは相手側にも生成しないといけないのでPhotonNetwork.Instantiate()で生成をしましょう。このスクリプトはNetworkManagerにアタッチしてください。
その後にProjectのなかにResourcesフォルダを作成、その中にPrefabを作成し名前をsampleCubeにします。
HierarchyからCubeを作成したらsampleCubeにprefabとして保存してCubeを削除。
Resources/sampleCubeを選択し以下の様にスクリプトとRigidbodyをアタッチ
・Photon VIew ・・・ Observed Componentsに監視するスクリプトを指定する。同期処理が書かれているスクリプトは全てここに。
・Photon Transform View ・・・ アタッチされているゲームオブジェクトのPosition、Rotation、Scaleの同期はこれ1つで大丈夫。
中身はこのように設定しています。
Synchronize Positionの設定
・Enable teleport for greater distances 同期が一定値以上ずれた場合オブジェクトをテレポートして位置を強制的に変更するか。
・Teleport if distance greater than その値以上同期がずれたらテレポートします。
・Interpolate Option(オブジェクト補間) 補完オプション。設定しないことはないと思う。
- Disable(無効) これを設定することはほとんどないはず。
- Fixed Speed(固定速度) 固定されたスピードで動くオブジェクトならこれ。
- Estimated Speed(推定速度) 現在の座標と直前の座標から速度を割り出して移動させる。ゆっくり移動するものならこれ。
- Synchronize Value(値を使って同期) スクリプトで直接値を設定して同期する。一番スムーズ、けどデータ量増える。
- Lerp(線形補完) お手軽に使えるLerp。とりあえず動かしたいときはこれ。
・Extrapolate Option(オブジェクト補外) 補外オプション。過去のデータから現在どこにいるのか推測する。あくまでも推定。
・Draw synchronize position error(同期位置誤差の表示) Sceneに座標が表示される。
Synchronize Rotation/Scaleの設定
・Disabled(無効) 新しい値を受信したらオブジェクトに適用
・RotateTowards/MoveTowards オブジェクトがターゲットに向かって回転/スケールする。
・Lerp オブジェクトを指定値に向かって回転/スケールするらしい。
説明は以上です。
今回はLerpで行ってみましょう。
画像のように設定すれば大丈夫かと思います。Photon Viewにのbserved ComponentsにPhoton Transform Viewの設定をするのを忘れずに。
あとは適当にオブジェクトを移動する処理でも書いてsampleCubeにアタッチしてください。こんな感じで。
あとはビルドしてみて同期されるかどうか確認してください。Lerpで移動同期しているので滑らかではありますが、少し反映が遅れているはずです。
次回はSynchronize Valueの方法を試してみようかな。
若干疲れているので書き間違えていたりしたらすみません。
LuxとWater FXで雨を作る
前回の記事で紹介したLuxと同じくアセットであるWater FX Packを使って雨っぽくしようと思います。
完成するとこんな感じになります。
まずは上に貼ってあるリンクからWater FX Packをインポートしてきてください。
インポートが終ったらシーンを新しく作りましょう。
シーンを作成したら、Lux2.0/Demos/Lux Wet Shaders Demo/Objectsの02_streetをHierarchyにD&D。マテリアルにLux WaterFlow Bumped Specularをセット。
Add ComponentからSetup Lux 2.0を追加してLux_Rain_RipplesにAnimated_WaterDropsをアタッチしてください。
あとはこのような感じでお好みでパラメーターを調整してください。
次に降って来る雨を作成しましょう。まぁPrefabから持ってくるだけですがw
Water FX PackにあるPrefabsからRainをD&DでHierarchyに追加。
割とそのままでもそれっぽいんですが、同様に好みで値を調整してください。
これで完成です!!
Luxを試してみる(導入のみ)
LuxというUnityで使えるシェーダーアセットがあるらしい。
ということでダウンロードしてきて試してみました。
アセットストアのサンプルシーンを試したいのならこちらで、Unity5にも対応したバージョンを使いたいのでしたらこちら。
今回はLux2.0の方を試してみます(ホントに試すだけ)
とりあえずDemoにあるLux Wet Demoを再生してみる。
( ゚Д゚)ヒョエー
シェーダーってこんなことも出来るんですね…シェーダー書かれてるし勉強してみようかな、これ初心者が読んでもわからないレベルかもしれないけどw
とりあえず、Luxを使ってなんか作ってみよう。
全然関係ないけどRainってゲームがありますよね。やってみたい。
LeapMotionのImageHandの手が白くなっていた現象
少し遅れてしまったけど、LeapMotionのバージョンアップで追加されたImageHandを試してみました。
が、うまく動かない・・・公式通りに設定をしても動かない・・・
やけに手が大きく、そして白っぽく映ってしまっている。
ネットで調べてみても解決方法がわからなかった(というかこの現象にあっている人がいないみたい)ので自分の根本的な問題なんだろうなーと思ってLeapMotionのコントロールパネルを開くと、イメージを許可するにチェックが入っていなかった!!
調べていたサイトにImageHandは画像データ使っているよ~って書いてあったのを思い出して見てみたらこれか・・・
とりあえず、チェックをいれて適用をしてから再度再生させてみると・・・
出来た!!
こんなところが原因だったとは思っていなかったです。
チェック外した覚えないけど、いつの間にwww
もしも同じことで困っている人がいた場合のために書いておく(いるのか?)
オクルージョンカリング
ZENRIN City Asser SeriesはUnityで使える都市モデルです。
ステージ作る手間なくゲーム開発が出来るので割と重宝するのですが、如何せんモデルのDrawcall数が多く、Oculus Riftの開発で使うとなるとレンダリング回数2倍になるのであまりよろしくないかな?って思ったので減らす方法を調べてみた。
オクルージョンカリング
あった。公式に。
他のオブジェクトに遮られているオブジェクトはレンダリングされないように出来るんですね。細かい話だと、一部分でもカメラに映っていれば、そのオブジェクトは全体がレンダリングされるようです。
・・・カメラのFarの設定変更するしかないのかなって思ってました。