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

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

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

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

Q&A

解決済

1回答

6551閲覧

[unity]プレハブの座標を得てオブジェクトを動かしたい

syaado-5243

総合スコア7

Unity3D

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

0グッド

1クリップ

投稿2016/06/30 04:05

編集2016/06/30 08:01

unity5でホッケーゲームを製作中なのですが、敵AIの作り方が分かりません。
別スプリクトでプレハブ化したボールのx,z座標を取得し、それを跳ね返すように敵のオブジェクトを左右に移動させるC#スプリクトを書きたいです。
宜しくお願いします。
追記
Rigidbodyでy方向の移動と回転をフリーズ、Use Gravityのチェックを外して、

c#

1using UnityEngine; 2using System.Collections; 3 4public class ballmove : MonoBehaviour { 5 public int speed; 6 Rigidbody rb; 7 // Use this for initialization 8 void Start () { 9 rb = GetComponent<Rigidbody>(); 10 rb.AddForce((transform.up + transform.right) * speed, ForceMode.VelocityChange); 11 } 12 13 // Update is called once per frame 14 void Update () { 15 16 } 17}

というスプリクトを当てて移動するようにし、プレハブ化したボールのオブジェクトを
イメージ説明
この大砲のオブジェクトに

C#

1using UnityEngine; 2using System.Collections; 3 4public class shoot1 : MonoBehaviour { 5 6 // Use this for initialization 7 void Start () { 8 9 } 10 public GameObject ball; 11 // Update is called once per frame 12 void Update () { 13 14 if(Input.GetButtonDown("ball1")){ 15 Instantiate(ball,transform.position,transform.rotation); 16 17 } 18 } 19 }

というスプリクトをあててボールを発射させるようにしました。
図の上にある黒いバーが敵で、上記で発射されたボールのx,z座標を取得し、if文でボールのz軸が0より大きくなったら得たx軸座標へ決めた一定のスピードで移動して、間に合えばボールを跳ね返す
よう動作するc#スクリプトを書きたいです。
よろしくお願いします。

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

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

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

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

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

urahimono

2016/06/30 06:02

製作中であるホッケーゲームの作りが分からないため、なかなか回答し辛い状況です。 可能でしたら、製作中のホッケーゲーム部分のスクリプトやオブジェクト構成と一緒に、スクリプトのこの部分にAI処理を組み込んで欲しい!などのコメントを追加して、質問内容に追記していただけると回答しやすくなると思います。
syaado-5243

2016/06/30 08:43

アドバイスありがとうございます。詳細追記しました。
guest

回答1

0

ベストアンサー

Vector3.MoveTowards()を利用してバーの位置を移動させる方法が考えられます。
Vector3.MoveTowards
ボールのx座標にバーのx座標を最大でm_moveSpeed分だけ移動させることができます。

下記のコードの例ではゲーム画面中央の座標が( 0, 0, 0 )である前提の作りになっているので、参考になさる際はご注意ください。

csharp

1using UnityEngine; 2 3public class AI : MonoBehaviour 4{ 5 // 最大移動速度 6 [SerializeField] 7 private float m_moveSpeed = 5.0f; 8 9 private GameObject m_ball = null; 10 private Vector3 m_centerPosition = Vector3.zero; 11 12 void Start() 13 { 14 // 初期位置を保存しておく 15 m_centerPosition = transform.position; 16 } 17 18 void Update() 19 { 20 // ボールを見つけていなかったら、Hierarchy上からballmoveコンポーネントを探す 21 if( m_ball == null ) 22 { 23 var ball = GameObject.FindObjectOfType<ballmove>(); 24 if( ball != null ) 25 { 26 m_ball = ball.gameObject; 27 } 28 } 29 30 Vector3 curPos = transform.position; 31 Vector3 targetPos = Vector3.MoveTowards( curPos, GetTargetPosition(), m_moveSpeed * Time.deltaTime ); 32 33 // TODO: 左右の壁を無視しているため、対応が必要 34 transform.position = targetPos; 35 } 36 37 private Vector3 GetTargetPosition() 38 { 39 // ボールが見つかっていないなら、初期位置に戻る 40 if( m_ball == null ) 41 { 42 return m_centerPosition; 43 } 44 45 var ballBody = m_ball.GetComponent< Rigidbody >(); 46 Vector3 ballVelocity = ballBody.velocity; 47 Vector3 barPos = transform.position; 48 49 // バーの方向と反対方向にボールが進んでいるなら、初期位置の戻る 50 // TODO: ゲーム画面中央の座標が( 0, 0, 0 )である前提の作りのみに対応している点に注意 51 if( ballVelocity.z * barPos.z < 0.0f ) 52 { 53 return m_centerPosition; 54 } 55 56 // ボールが画面中央より離れていたら、初期位置に戻る 57 // TODO: ゲーム画面中央の座標が( 0, 0, 0 )である前提の作りのみに対応している点に注意 58 Vector3 ballPos = m_ball.transform.position; 59 if( Mathf.Abs( barPos.z - ballPos.z ) > Mathf.Abs( m_centerPosition.z ) ) 60 { 61 return m_centerPosition; 62 } 63 64 65 Vector3 targetPos = barPos; 66 targetPos.x = ballPos.x; 67 return targetPos; 68 } 69 70 71} // class AI

イメージ説明

投稿2016/06/30 21:30

urahimono

総合スコア714

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

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

syaado-5243

2016/07/01 00:19

ありがとうございます! 問題なく動作しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問