ひとまず某密林で変換コネクタを注文し試しているところです。, …と、どうでもいい前置きを挟んだところで、本日のお題は「3Dカメラ視点移動」です。, 実は今までのUnity歴で「3D空間を移動・探索する」というゲームをほとんど構築したことがなく、3Dにおけるカメラ移動やロックオンの実装方法はあやふやだったりします。 合わせて以下のスクリプトを作成し、こちらも設定します。, SphereColliderに入った敵を取っておくだけのスクリプトです。1オブジェクトしか保持しないため、敵が単体ならまだしも、複数入ってくると使い物になりません。 視点移動の制限についてのことなのですが、 前回の連載記事はCamera入門②「カメラの切り替えをスクリプトで実現しよう」でした。, 連載の第三弾となる今回は、追従するカメラをマウスの動きに連動させて回転させる方法をご紹介します。, また、カメラをオブジェクトを中心に回転させる上で重要になるプログラムの記述についても詳しくご紹介します。, カメラと被写体の位置関係は任意ですが、ここではメインカメラを被写体オブジェクトの子オブジェクトとしています。, このスクリプトを作成するために、空のゲームオブジェクト「CameraController」を作成します。, ヒエラルキービューで作成したCameraControllerを選択し、インスペクタービューの最下部AddComponentでスクリプトを作成します。, 今回、ユニティちゃんのアセットを使用している都合上、名前を「CameraControll」とします。(ユニティちゃんアセット内に「CameraController」というスクリプトが存在するため、同名を避ける目的), Static変数も準備されています。Unityの記事でよく見かける表現もありますね。(公式マニュアルより), GetAxis()はfloat型を返す関数です。引数に「Mouse X」「Mouse Y」と与えることでマウスのX・Y軸のそれぞれの動きに合わせた値を返します。, ある一点を中心にオブジェクトを回転させるための関数で以下のように定義されています。, 引数の意味は「ワールド座標の point を中心とした軸( axis )で angle 度回転」です。(公式マニュアルより), 今回のプログラムではpointにユニティちゃんの座標、axisに回転軸となるX軸(transform.right)・Y軸(Vector3.up)、angleに回転する角度を与えています。, 作成するスクリプトでは矢印キーで左右上下に回転することができるカメラを作成します。, 以下のスクリプト「CameraController」をメインカメラにアタッチして動きを確認してみてください。, Unityカメラの連載(Camera入門)第三弾として、カメラの回転方法についてご紹介してきました。, 今回はマウスの動きに連動させた回転の実装でしたが、入力の受付方法を変えればキー入力など他の方法でも回転させることができると思います。, 前回の連載記事よりもプログラムについての解説が増えてしまいましたが、マスターしてカメラを使いこなせるようになりましょう。, Unity関連記事)【入門】Unityを使ったアプリ開発ができるようになる!Unityの基本からARへの応用まで, この記事はいかがでしたか?もし「参考になった」「面白かった」という場合は、応援シェアお願いします!, PSVR / Oculus Rift / Oculus Go / Oculus Quest / HTC Vive / Gear VR / Windows MR/ VRゴーグルまとめ / スマホ VR  / スタンドアロン型 / SteamVR, キズナアイ / VRゲーム  / VR ZONE SHINJUKU / Steamゲーム / PSVRゲーム / Vtuberまとめ, produced by x garden OculusGoでアプリが作りたくてUnityを勉強中です。 今回はオブジェクトの移動方法の備忘録です。用途としては「OculusGo用のカメラをコントローラーなどで移動させる」際に使うことになると思います。 1:絶対座標での移動方法 Unityのオブジェクトには「Transform」という項目があります。 ですが、Size値を読み取った後に、カメラZ移動のストップ処理を行ってしまっているため、Z方向のストッパ位置が マウスによる操作 位置を固定したままカメラの向きを変える FPSやTPSのゲームではカメラの回転に制限がかかっています。ですがカメラをtransdorm.Rotate()でただ回転させるだけだと、上下への回転(x軸に対する回転)が一回転しておかしなことになってしまいます。 今回はこれを解決する 「回転に制限のついたカメラ」を作ります。 //transform.RotateAround()をしようしてメインカメラを回転させる, 【入門】Unityを使ったアプリ開発ができるようになる!Unityの基本からARへの応用まで, 【Déraciné レビュー】PSVR×傑作ADVゲームの評価、魅力、攻略方法まとめ!. 今回は四元数ではなくx,y,zの値で表現されたEulerAnglesなどがあるのでこれを角度制限のフックに使います。, eulerAnglesとlocalEulerAnglesのx,y,zは時計回りに0°~360°の値になっているので180°前後の条件も付けています。, monimoni114514さんは、はてなブログを使っています。あなたもはてなブログをはじめてみませんか?, Powered by Hatena Blog CharacterMotorを強引に2D向けに使用している上、そのCharacterMotor自体が古いスクリプトというのもあり、このまま開発するのは無理があるかもしれません。一応2Dっぽい動きにはなっている上、場面によって3D移動ができるようにもしたので、限界が来るまで粘りつつ、次の手を模索してみます。, こんにちは、通りすがりで失礼します。 ※CameraはMainCameraを自動取得しています, unityのカメラは縦回転も360°回転させることができるんだけど、上記計算式では0°をまたいだ時にカメラが反転してしまうので、仰角の1°と179°でロックしてそれ以上回転しない様にしています。, 「たのしいさんすう」リリース開始!札幌で働くゲームデザイナーです。プログラマー10年、プランナー10年やっています。メインプランナー4本/ディレクター2本やりました。unityとソシャゲが好き。2児の父親です, 【unity】AnimatorControllerからState(アニメクリップ)を削除する【エディタ拡張】, 【unity】dynamicboneが割り当てられているボーンの一覧を表示&選択できるエディタ拡張【アセット】, 次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。, 【unity】Obi Fluidを使ってみる3:液体を白くする2 別アプローチ【アセット】, 【unity】Obi Fluid part4:リアルなコリジョンは重すぎるという話【アセット】, Twitterでバズったあの 仰る通り、本投稿のやり方にRotateAround()は不適当かと思います。 上にも書きましたが深く考えるとややこしいので、こんなものでいいでしょう。, 先述の視点移動制限があるため、至近距離でジャンプしてもそこそこ見やすい角度に収まります。, せっかくなので視点をリセットする機能も付けます。深いことは考えずにプレイヤーキャラクターのtransform.rotation.yに合わせて移動用オブジェクトに回転をかけましょう。 Transform.Rotateで軸がブレたとのことですが、y軸回転させると斜めになっちゃう感じですかね? マウスホイールを使って、カメラの平行投影(Orthographic)モードでカメラズームを検討しております | 指定が可能なことは知っていたのでWorldでの指定も試みましたが、改善しませんでした。, > Transform.RotateAround()は指定した点を中心に回転させる機能なので、用途が違うかなと 「回転に制限のついたカメラ」を作ります。 Unityでtransformを変更してオブジェクトを移動させる方法をわかりやすくまとめてみました。よかったら参考にしてください。 三本の平行線が並んだような図形に変化しました! この、三本の平行線が並んだような図形のときは ”遠近法が解除された状態”となっています。 この状態で視点のアングルを変えてGameObjectをみてみま … transform.rotationはQuaternion(四元数)で表現されています。 eulerAnglesはワールド基準による回転情報です。, エディター上の回転の値を、transform.rotation.xのように取得することはできません。 最近できた関数かと思いきや、かなり前からあるようです。やはり無知は罪であると思う。, 【2017/10/07 追記】 【Unity】Vector3を使った移動方法や長さの取得方法を紹介しています。長さの取得には「magnitude」を利用することが多いですが、これは負荷が大きいので、より低負荷な「sqrMagnitude」の使い方を説明しています。さらに、正規化に使用する「Normalize()」「Normalized」の違いも紹介。 ※「XR-Hub」商標出願中. ですがカメラをtransdorm.Rotate()でただ回転させるだけだと、上下への回転(x軸に対する回転)が一回転しておかしなことになってしまいます。 ということで、1つ空オブジェクトを作り、その子としてメインカメラを設定します。カメラの位置はゲームや場面に合わせて調整しましょう。, あとは親となる移動用オブジェクトをくるくる回せば、子となっているメインカメラも相対的に移動します。, 当然ながら、作成した空オブジェクトは「視点移動のベースとなるオブジェクト」の位置に移動させる必要があります。大抵はプレイヤーキャラクターが基点になるので、今回もそれに合わせてみます。, 先程のカメラ移動用オブジェクトに対して回転を掛けます。 ブログを報告する, 【Unity】で列挙型を使ってエディタで選択するやつでInputManager楽にしたい, 【UnityShader】Unityでレーダーっぽい模様のやつをやる(扇形を回転させるShader). 「難しいこと考えずにカメラ移動用オブジェクトを回すだけでしょ?」とTransform.Rotateを使いましたが、見事に軸がブレで上手くいきませんでした。これだからクォータニオンは苦手だとあれほど…! 以下のような感じです。, あとはこれを呼び出す記述をUpdate()内に追加すれば、最低限のものはできます。, このままの場合、左右は問題ありませんが、上下に移動させた際に視点が1回転してしまいます。3Dゲームの多くは上下に対する角度制限がある印象なので、それに習ってみます。 先日、UnityでCharacterControllerを使う場合、オブジェクトを動かすためのMove()とSimpleMove()では基本的にはMove()を使おうという記事を書きました。 そちらのサンプルスクリプトではキャラクターのオブジェクトが前後左右に平行移動するだけでした。 折角だからちゃんと3Dゲームで使える感じの動きにしてみようと思って回転処理を実装したらまたしても沼にハマったため、最終的に出来上がったスクリプトと解説をまとめることにしました。 新年度からの目標は、戦いの記録を積極的にアップして … 手っ取り早く動かしたい人は完成スクリプトコピペしてください, マウスの移動に合わせ、上下に制限つき、左右に制限なしで回転するカメラ 深く考えると「ロックオン可能な距離」や「複数のロックオン対象がいる場合の選別」などあれこれあるので、シンプルに「特定の判定に入った敵をロックオン」だけ考えてみます。, 下準備として、ロックオン対象を検知するためのオブジェクトを作成し、プレイヤーキャラクターの子オブジェクトとして設定します。, 検知用オブジェクトにはShpereColliderを設定し、IsTriggerにチェックを入れておきます。 transform.Rotateで回転させていますが、 Unityでのブロック崩しゲームの作り方を説明します。内容的には2時間くらいで作成できるものですが、初心者向けに非常に詳細に書いているので、是非参考にしていただければ幸いです。 ・ソースを適当なオブジェクトにAddして使います。 無理やり上下にマウスを動かすと画面が反転してしまいます!, ご指摘ありがとうございます。確かに稀に逆さまになってしまいますね…。 お問い合わせはこちらから Unityカメラの連載(Camera入門)第三弾として、カメラの回転方法についてご紹介してきました。 今回はマウスの動きに連動させた回転の実装でしたが、入力の受付方法を変えればキー入力など他の方法でも回転させることができると思います。 具体的には`rotateCmaeraAngle()`を以下のように修正します。, 【Unity】エディタ拡張でシーンビューからオブジェクトを選択した際の挙動を変えてみたお話, AWSのLambdaへのリクエストがCORSエラーかと思ったらサイズが大きすぎたお話, 【Unity】2DAnimationでboneを入れてSpriteを動かしてみたお話, 【Unity】パラメータ変更するマテリアルをアセットから実行中のインスタンスに変えたお話, 【Unity】AnimationControllerでループするステートから一定確率で別のモーションを実行する方法, アザラシが大好きな山梨県産Webエンジニア。2019年3月よりフリーランスSEとして東京で活動中。自称「Web業界のアザラシ」 [詳細], Unity2019.3でBlenderのImportSettingsが正常に表示されない現象の対処法, 「第2回 1週間でWebサービスを作るイベント(web1week)」に参加しました!, AWSの「Lambda + CloudWatchイベント」でサイトの監視をさせてみたお話, 【Visual Studio2017】VB.NETのインテリセンスをEnterで確定した場合に改行させない方法, 【Unity】体力ゲージの実装方法の紹介 (一瞬で減る緑ゲージ+徐々に減る赤ゲージ). リセット用のキーはロックオンと同じ「R」でいきます。, 単に値を設定するだけでは瞬時に回転して味気ないので、iTween.RotateTo()を使用して徐々に変化するようにします。ハッシュのrotationにはtransform.eulerAnglesを指定しましょう。, ちなみにtransform.forwardをiTween.ValueTo()やDOTween.To()等でプレイヤーの値に合わせることでも実現できますが、現在の向きと真反対を向いた際にイージングが上手くいかないので見送りました。, そんなわけで、今更3Dカメラの動かし方についておさらいしてみました! 1 / クリップ 本記事の内容にTransform.RotateAround()は不適切だったので、transform.eulerAnglesに加減算する形に修正しました。 そのx,yの値を変更してから代入しなおすことで回転させています。 このままだとY軸の回転が常にワールド基準のY軸を元にした回転ではなくなるため、 ここで面倒になるのは下方向に向けた場合で、X軸の角度的には0→360度になるため、Transform.eulerAnglesの値そのままで制限するのは厳しいです。なのでX軸だけちょっと細工を入れます。, 三項演算子で「Transform.eulerAngles.xが180度以上であれば360度減算する」処理を入れます。超ダイレクトな方法ですが、これでX軸の角度が-180~180度の間になり、Mathf.Clamp()での制限が容易になります。, ついでにカメラ視点移動を「マウス右クリック中」のみにしてみました。定数ROTATE_BUTTONで1を指定しておき、Update()内のrotateCmaeraAngle()呼び出し前にifで判定します。, 今日の3Dゲームでは必ずと言っていいほど備わっている「ロックオン」機能です。 解決したいことキャラクターの移動を一枚のスクリプトで行っています、移動の方法はAddForceで上下左右に平行移動させ、これに回転を組み合わせています。移動に関してはこちらの記事を参考にさせていただきました。UnityでRigidBodyのAddForce()に速度制限をつけてすーっと動かして … どなたか恐れ入りますがご教示いただけると幸いです。, teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。, 評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。, 上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。, 「カメラのSize値範囲とZ方向の移動範囲を完全にリンク」ってことなら