質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3163閲覧

【Unity】キャラクターがプレイヤーの方を見る

zavel

総合スコア5

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/02/17 08:51

前提・実現したいこと

Unityでプレイヤーがキャラクターの正面の扇状に入った場合に、
キャラクターの首がプレイヤーの方を向くスクリプトを作っています。

https://gomafrontier.com/unity/1772
を参考にし、

該当のソースコード

C#

1protected virtual void LateUpdate() 2{ 3 //■動かすボーンと対象が存在する。 4 if (neckBone != null) { 5 if (watchTarget != null) { 6 //対象との距離が一定以下である 7 if(Vector3.Distance (transform.position, watchTarget.transform.position) < 1.5f ){ 8 9 //対象が正面にいる。 10 //? 11 12 //対象を取得し角度計算(横軸) 13 Vector2 target_pos = new Vector2(watchTarget.transform.position.x, watchTarget.transform.position.z); 14 Vector2 char_pos = new Vector2(transform.position.x, transform.position.z); 15 Vector2 direction = target_pos - char_pos; 16 float angle = -(Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg) - 90f; 17 18 //対象を取得し角度計算(縦軸) 19 //対象との距離 20 float distance = Vector3.Distance (transform.position, watchTarget.transform.position); 21 //自分の高さ-対象の高さ=高度差 22 float altitude = transform.position.y - watchTarget.transform.position.y; 23 //サイン = 高低差 / 距離 *ラジアン角を角度に 24 float angletate = Mathf.Sin(altitude / distance) * Mathf.Rad2Deg; 25 26 //親ボーンや姿勢に関係なく、独立して角度をとる。 27 neckBone.rotation = Quaternion.identity; 28 //首の角度の直接入力 29 neckBone.Rotate(angletate - 0f, angle - 180f, -0f); 30 } 31 } 32 } 33} 34

と書いてみましたが、横軸はプレイヤーを追従するものの、縦軸はプレイヤーを追いかけてくれず、
また、正面の扇状にプレイヤーがいるかの判定もどう取得するか分からないため、真後ろにも首が回ってしまう状態です。

縦軸の角度取得および正面判定方法について
ご助言いただけるとありがたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんばんは。
コードと参考サイト読ませて頂きました。

縦軸の角度取得

コードを見る限りでは縦軸の角度取得も問題無いです。
後ほど私の方でもテストしてみます。

・テスト結果
イメージ説明

やはりコードは問題ありませんでした。
試していて気付いたのですがこの計算式は**「Zフォワード Yアップ」**のUnity準拠の座標軸でないと正常に計算されないと思います。

モデル・ボーンの座標軸がその状態になっていない場合は修正をおこなう必要があります。

・回転軸画像

このコードで正確に首を振るには下図画像と回転軸が同じ必要があります。
**「Zフォワード Yアップ」**と言っている事は同じなのですが画像と違う場合はモデルを調整して下さい。

X軸:縦方向 Y軸:横方向
イメージ説明

正面判定方法

扇型は若干手間が掛かります。

1a.扇型のメッシュを用意してそれにMeshColliderを適用する。
1b.扇型をコードから生成する。
参考サイト:https://www.urablog.xyz/entry/2017/10/22/183331

上記の好きな方でおこなって下さい。

2.扇型のメッシュを頭部分の子にする。
3.OnTriggerStayを使って処理をそちらに移す

視界内に入った時の処理は以上で終わりです。
途中判らない事や終わった後に足りない点があればまた質問して下さい。

投稿2020/02/17 12:37

編集2020/02/19 01:48
Hawn

総合スコア1222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zavel

2020/02/17 15:14

ご回答ありがとうございます! 自分で調べられる範囲ではモデルにそういった制限は見受けられなかったのですが、 やはりこのままのスクリプトでは首の縦回転がうまくいかないようです。 ・・・ 正面判定はコライダーを利用して当たり判定を取るのですね。 扇状は難しいとのことで、キャラ正面にボックスコライダーを置く形にしたらなんとか正面を取れました。
Hawn

2020/02/17 15:27 編集

首の回転に関しては3Dモデルの構造を見ない事には推測の域を出ないのですが座標軸の問題かもしれません。 「Unity内で作成したゲームオブジェクトを選択した時」と「そのキャラクターの首、若しくはそのボーンを選択した時」で矢印の方向と色が合っていない場合はその可能性が高いです。
zavel

2020/02/18 15:42

他のモデルにスクリプトを差し替えて検証してみたのですが、やはり首はほとんど上下動がありませんでした。 Debug.Logでangletateをとってみた所、プレイヤーが頭より上にいる際で-45、下にいる際で-25と出たので、これは上にいるときと下にいる時で首の角度が20度しか違っていないという事でしょうか…。
Hawn

2020/02/19 02:54 編集

>他のモデルにスクリプトを差し替えて検証 そのモデルを見ないと何とも言えませんが多くのモデルは調整しないとこのコードで正確に首を振れないと思います。 Unityちゃんやこのエヴァン君も調整しないと振れませんでした。 >20度しか違っていないという事でしょうか X回転軸が正面であればそうなりますがこちらも文章で書かれるだけでは正確には判断出来ません。 追加した画像の回転軸と同じか確認してみて違う場合は自身で調整して下さい。 若しくは回転軸などの詳細が判る画像などあげて貰えれば判断出来るかもしれません。
zavel

2020/02/20 08:46

ご親切にありがとうございました! この先はモデルとプレイヤーの調整になると思いますが、 式自体は間違っていないと分かった事、正面判定はとれた事から解決済とさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問