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

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

ただいまの
回答率

88.92%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 509

zavel

score 5

前提・実現したいこと

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

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

該当のソースコード

protected virtual void LateUpdate()
{
    //■動かすボーンと対象が存在する。
    if (neckBone != null) {
        if (watchTarget != null) {
            //対象との距離が一定以下である
            if(Vector3.Distance (transform.position, watchTarget.transform.position) < 1.5f ){

            //対象が正面にいる。
            //?

            //対象を取得し角度計算(横軸)
            Vector2 target_pos = new Vector2(watchTarget.transform.position.x, watchTarget.transform.position.z);
            Vector2 char_pos = new Vector2(transform.position.x, transform.position.z);
            Vector2 direction = target_pos - char_pos;
            float angle = -(Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg) - 90f;

            //対象を取得し角度計算(縦軸)
            //対象との距離
            float distance = Vector3.Distance (transform.position, watchTarget.transform.position);
            //自分の高さ-対象の高さ=高度差
            float altitude = transform.position.y - watchTarget.transform.position.y;
            //サイン = 高低差 / 距離 *ラジアン角を角度に
            float angletate = Mathf.Sin(altitude / distance) * Mathf.Rad2Deg;

            //親ボーンや姿勢に関係なく、独立して角度をとる。
            neckBone.rotation = Quaternion.identity;
            //首の角度の直接入力
            neckBone.Rotate(angletate - 0f, angle - 180f,  -0f);
            }
        }
    }
}


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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

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

縦軸の角度取得

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

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

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

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

・回転軸画像

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

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

正面判定方法

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/19 00:42

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

    キャンセル

  • 2020/02/19 01:29 編集

    >他のモデルにスクリプトを差し替えて検証
    そのモデルを見ないと何とも言えませんが多くのモデルは調整しないとこのコードで正確に首を振れないと思います。
    Unityちゃんやこのエヴァン君も調整しないと振れませんでした。

    >20度しか違っていないという事でしょうか
    X回転軸が正面であればそうなりますがこちらも文章で書かれるだけでは正確には判断出来ません。
    追加した画像の回転軸と同じか確認してみて違う場合は自身で調整して下さい。

    若しくは回転軸などの詳細が判る画像などあげて貰えれば判断出来るかもしれません。

    キャンセル

  • 2020/02/20 17:46

    ご親切にありがとうございました!

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

    キャンセル

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る