Unityを使った3Dゲームの作り方(かめくめ)ゲーム開発エンジンUnityを使った3Dゲームの制作に参考になる情報を公開しています。2019.03.03今回は操作キャラクターの回りを旋回する弾を発射する攻撃ユニットの作成をしていきたいと思います。キャラクターを移動させてもキャラクターの回りをグルグル回り、ユニットの攻撃ボタンを押したらユニットが向いている方向(キャラクターからユニットを見た方向)に弾を飛ばすようにしたいと思います。シューティングゲームやアクションゲーム等で使えそうですね。(^^)vスポンサーリンク攻撃ユニットの作成それでは攻撃ユニットの作成をしていきましょう。今回はユニットをUnityのCubeで作成していきます。Object→Cubeを選択し、名前をUnitとします。次にUnit用のマテリアルを作成します。Assetsエリア内で右クリックからCreate→Materialを選択し、名前をUnitMaterialとします。UnitMaterialを選択し、インスペクタのAlbedoの色を赤色にします。0にUnitMaterialをドラッグ&ドロップします。マテリアルが適用されるとUnitが赤色になります。デフォルトのCubeだとユニットとしては大きいのでTransformのScaleを0.3にし少し小さくします。Component)。これでUnitのインスペクタは上のようになります。これでユニットのゲームオブジェクトが出来ました。ユニットがキャラクター回りを旋回するスクリプトユニットが出来たので、次は操作キャラクターの回りを旋回するようにスクリプトを作成していきます。ユニットが操作キャラクターの回りをグルグル回るスクリプトはUnityのゲームキャラクター操作をすべてマウス操作で行うUnityのゲームで使用するキャラクターの移動やカメラの回転、カメラのズーム機能、カメラの壁対策、人との会話、敵を攻撃等のすべてをマウス操作で行う為の機能を作成していきます。gametukurikata.com2016.09.19の記事で作成したキャラクターの回りをカメラが回る機能と同じようにして作成します。カメラをユニットに置き換えて計算していくことになります。操作キャラクターからユニットまでのベクトルという計算式を使います。計算式を見ると分かり辛いですが、まず操作キャラクターの位置を中心として、そこからユニットがある位置を計算します。ユニットの角度はUpdateメソッドが呼ばれる度に少しづつ角度を変化させます。いうわけでそれを元にスクリプトを作成しUnitに取り付けます。360f);}}ユニットが旋回するターゲットはインスペクタで設定出来るようにしておきます。angleはキャラクターから見たユニットの角度を入れます。rotateSpeedはユニットが1秒間に回転する角度を指定します。ターゲットからの距離はtargetに設定した操作キャラクターからユニットまでの距離をベクトルで指定し、ユニットの位置をインスペクタで設定出来るようにしています。Updateメソッド内が実際にユニットの位置を作成している処理です。ターゲットから見たユニットの角度はQuaternion.Eulerを使ってオイラー角を指定しますが、ターゲットを中心にY軸で回転させる為にY軸にangleを指定し、X軸とZ軸は0で固定にします。ユニットの位置はこれで出来ましたがこの後、弾を飛ばす時にユニット自身の角度をキャラクターから見たユニットの方向に向けさせておく必要があります。ユニットの位置からターゲットの位置を引いてユニットの方向を求め、Quaternion.LookRotationを使ってVector3.up(Y軸)を軸にして角度を求め、それをユニット自身の角度とします。その後angleを回転スピード分足します。角度は0~360の間で収めたいのでMathf.Repeatを使っています。これで操作キャラクターの回りをグルグル回るユニットが出来ました。ユニット位置の計算を実際に試して理解するユニットの位置や角度の計算式が分かり辛い方は実際にゲームオブジェクトを設置して試してみるとわかりやすいかもしれません。Cubeをヒエラルキー上に配置しスクリプトを取り付けます。target.position;}}上のスクリプトではインスペクタで設定したターゲットの位置にCubeが来るだけです。上の画像では右上のCubeが最初にCubeを配置した位置で、キャラクターをtargetにしているのでキャラクターの足元にあるのがこのスクリプトを設定したCubeの位置です。次にY軸で45度回転しベクトルをかけてユニットの位置を計算する処理を足します。Mathf.Sqrt(2))をかけることでその角度の前方に√2の長さの位置にターゲットの位置を足してユニットの位置を求めます。前方にルート2としているのは三平方の定理で横と縦が1だと斜め方向の長さがルート2となるのでUnityのシーンビュー上で丁度スリットの真ん中にCubeがくるようにしたかった為です。1)の位置に置いてあります。下のCubeがスクリプトで計算した位置でターゲットであるキャラクターの位置からY軸で45度回転し、その方向のベクトルにルート2の長さ分移動したものです。ユニット自身の角度を実際に試して理解する次はユニット自身の角度をキャラクターからユニットの位置の方向に向けるのを実際に試して確認してみます。Vector3.up);}}上のスクリプトではVector3.forwardでワールド空間の前方(Z軸)の方向-を付けて反転させ、Vector3.up(Y軸)を軸にした角度をQuaternion.LookRotationで計算しています。上のように上のCubeは元の角度なのでデフォルトのままワールドのZ軸と同じ方向を向き、下のCubeはスクリプト計算して角度をワールドのZ軸の反対側にしています。ユニット自身の角度の計算が出来たところで、次はキャラクターからユニットの方向を求めその角度をユニットの角度に設定すればユニット自身の角度がそちらの方向を向いてくれます。Vector3.up);}}上のようになります。ユニットとキャラクターのY軸の位置が違うと向く方向が変わってしまうので、キャラクターの位置のY軸をユニットのY軸と同じにして計算します。上のようにユニット自身の前方(ローカルのZ軸)がキャラクターからユニットの方向になっているのがわかります。ユニットが攻撃出来るようにするスクリプトユニットが操作キャラクターの回りをグルグル回るようになったので、次はユニットの攻撃ボタンを押したらユニットが向いている方向に弾を飛ばす処理を作成していきます。RotateUnitスクリプトに追記していきます。5f);}}}弾のプレハブ、弾を飛ばす力をインスペクタで設定出来るようにします。Updateメソッド内でFire1に設定したボタンを押した時に弾のプレハブからインスタンスを生成しています。弾の生成位置はユニットの位置と角度にします。弾のインスタンスに設定しているRigidbodyコンポーネントを取得しAddForceメソッドでユニットの前方(transform.forward)に力を加えて飛ばします。ここら辺の処理はUnityのアクションゲームで物理的な弾を飛ばして敵との当たり判定をするUnityのガンシューティングゲームなどで銃から弾を飛ばす場合にスクリプトで敵と接触したか判断するのではなく、物理的な弾を飛ばしその弾が当たったかどうかで判断させますgametukurikata.com2016.06.21の記事あたりと同じですね。Gravityのチェックを外し重力が働かないようにします。ユニットのサイズに応じて出てくる弾のサイズも調整しておきます。後はBulletをAssetsエリア内にドラッグ&ドロップしてプレハブにし、RotateUnitのbulletに設定します。キャラクターを旋回する攻撃ユニットの完成キャラクターの回りを旋回する攻撃ユニットが出来上がりましたので、ユニットを幾つか配置し設定を変えて試してみましょう。上のようになりました。上の例ではユニットを4つ配置しそれぞれのインスペクタでユニットのY軸の角度であるangleの初期値をインスペクタで変えてユニットが同じ位置にこないようにしています。angleはそれぞれ0、90、180、270を設定しています。終わりに今回の攻撃ユニットはY軸で回転していますが、スクリプトの角度の部分を変えることで縦回転や不思議な回転にする事も出来ます。Vector3.up);上のように回転軸であるaxisOfRotationにangleをかける形にして、ユニット自身の角度を作る時にY軸の位置を合わせた計算をしないようにします。上の例では一括でaxisOfRotationにangleをかけてますが、Vector3のXYZのそれぞれの角度を更新する事も出来ます。すると色々面白い動きをするユニットが出来るかも?しれません。コピーかめくめちゃんをフォローする7Unityを使った3Dゲームの作り方(かめくめ)Unityを使った3Dゲームの作り方(かめくめ)関連記事プログラムUnityのCharacterControllerの接地が判断出来ない時にスクリプトを使うUnityのキャラクターをCharacterControllerで動かしている場合に地面とキャラクター(厳密にはコライダ)が接地しているかどうかはIsGroundedプロパティで判断していますが、坂を下っている時はこの値がfalseになっています。そんな時にスクリプトで接地を判断してみます。プログラム移動キーを素早く2回押して走るようにする機能の作成Unityのキャラクター移動で移動キーを素早く2回押す事で歩きから走りに切り替えるような機能を作成していきます。プログラムUnityのメソッドAwakeとStartの違いUnityで初期化処理等でよく使うAwakeとStart関数の違いを検証してみますプログラムUnityのキャラクターでジャンプアップから着地までのアニメーションを変更するUnityのCharacterControllerコンポーネントを使ったキャラクターでジャンプアップから着地までのアニメーションを変更するようにします。プログラムUnityで敵キャラを登場させて、目的地に移動させる敵キャラクターをシーンに配置し、動かす為のコンポーネントであるキャラクターコントローラーを取りつけ、目的地に向かって移動するようなスクリプトを作成して動かしますプログラムUnityのキャラクターのアニメーションの動きに応じてコライダのサイズを変更するUnityで使う当たり判定(コライダ)のサイズをアニメーションに応じて変更し、ジャンプ中のキャラクターのコライダのサイズを変更し狭い空間を通過出来るようにしてみます。C#のメソッドでの値渡しと参照渡しについてUnityでアニメーションの動きでキャラクターを動かすホームプログラムスポンサーリンクサイト内検索が出来ますプロフィール管理人のかめくめちゃんです。(-_-)メールはこちらにお願いします(記事に関する質問は送らないでください、返信は期待しないでください(._.))。kamekumechan@gmail.comいずれはSIRENやバイオハザードみたいなアクションゲームを作りたいと思っています。ゲームシナリオが書けないので面白いゲームはなかなか作れません・・・・。(^_^;)名前の由来はカメが好きだからです。プロフィールになってないな・・・・(-.-)Unityをこれから始める人へこれからUnityを使ってみようという方はUnityを使った3Dゲームの作り方(かめくめ)の歩き方Unityを使った3Dゲームの作り方(かめくめ)で、はじめてUnityの学習をする時の当ブログの記事を読む順番を書きました。機能を積み上げていく形になるので便利かも?gametukurikata.com2019.06.21の記事に記載の順番で見て頂くとUnityの基本的な使い方がわかり、簡単なアクションゲームや、TPSゲームの作成までが出来ます。自作タイピングゲームタイピングゲームを作りました。WebGL形式なのでPCのブラウザで遊べます。以下からプレイ出来ます。FinalTypingUnityを使って作成したローマ字入力のタイピングゲームです。gametukurikata.com2022.01.02お知らせ2023/01/24個人的にUnity2022.2.3f1をインストールしました。2022/10/14UnityのIKを使って足の位置と角度を地面に合わせる機能Unityのゲームでキャラクターの両足が別の高さの地面の上にある時にそれぞれの足をそれぞれの地面につけるようにする機能を作成しますgametukurikata.com2016.04.11機能を少し修正しました。2020/09/19コメント欄は閉鎖しました。今までコメントを投稿してくださった方はありがとうございました。(^^)/2018/08/07わたくしに出来る事は既に記事にしてあるので、ブログ右上の検索窓を活用してください。(._.)またブログの最初の方の機能を積み上げていく記事に関しての疑問点は当ブログ記事のスクリプトの説明と寄せられた質問への回答Unityを使った3Dゲームの作り方(かめくめ)の機能積み上げ形式の記事のスクリプトの説明と寄せられた記事の機能についての質問への回答を掲載しています。gametukurikata.com2019.08.01Unityを使い始めたばかりの人がつまづきやすい点を解消するUnityを使い始めたばかりの人が結構な確率で陥る不具合や疑問点を解消していきます。基本的にはブログに寄せられた質問への回答という感じです。gametukurikata.com2018.12.04も参照してみてください。小・中学生によるデジタルコンテンツ開発の全国大会ですuycc.unity3d.jp2022年大会の先行エントリーが開始されているようです。当ブログはハイスピードプランです。WordPressの編集画面の動作が早くなった。当ブログはハイスピードプランです。WordPressの編集画面の動作が早くなった。記事の内容に質問がある方へUnityを使った3Dゲームの作り方(かめくめ)の歩き方UnityのJavaScriptとC#を読み替えてどちらでも対応出来るようにするホーム検索トップサイドバータイトルとURLをコピーしました。