Unityにはヒエラルキー上に設置したゲームオブジェクト間に親子関係を結ばせることが出来ます。
親子間ではTransformの値の取り方が変化したり(子オブジェクトは親に対しての相対的な座標表示になる)、親が移動すると子も一緒に移動する、といった特徴があります。
親子関係については、こちらのサイト様が詳しいので参考にしてください。
れー様
Unityのオブジェクトの親子関係について【初心者向け】
https://dkrevel.com/makegame-beginner/parent/
この親子関係の機能を利用して、プレイヤーとボールとを親子関係にしましょう。
こうすることで、ゲーム開始時に、プレイヤーの移動に合わせてボールが一緒に動くようになります。
親子関係の作り方は、ヒエラルキー上で直接変更するか、あるいはスクリプトを使って動的に親子にするか、といった方法があります。
ヒエラルキー上に親子にするゲームオブジェクトがある場合、ドラッグアンドドロップして親子にすることが出来ます。
https://gyazo.com/b7b52310cf15c3e7ef0c0b9293b159b0
スクリプトの場合(ゲーム実行時に親子にする処理がある)
https://gyazo.com/85a619c38477eb2a7881e45b9921ca97
親子関係にすることはできましたが、このままの状態でボールを発射しますと、ボールの位置情報が親に対しての位置情報になっているため
正常な方向へと発射することが出来ません。
そのため、発射のタイミングに合わせて、ボールとプレイヤーとの親子関係を解消する必要があります。
https://gyazo.com/0a4602bc7adf4bb628bb74e073f60638
動画を観て頂くとおわかりいただけるように、ボールが発射されるときには、プレイヤーとボールとが親子関係を解消し、
それぞれが別々のゲームオブジェクトとして独立しているのがわかると思います。
それでは、親子関係を構築する場合と解消する場合を実際にスクリプトから変更できるようにしましょう。
StartShot.cs
<= クリックすると開きます。(bool型でボールの発射を制御している処理に追記しています)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StartShot : MonoBehaviour {
private bool isShooted = false;
public float addSpeed = 500;
void Start() {
// スクリプトから親子関係を構築する場合(PlayerゲームオブジェクトにPlayerタグを設定してください)
transform.SetParent(GameObject.FindGameObjectWithTag("Player").transform); // ☆ 追加
}
void Update() {
if (Input.GetMouseButtonDown(0) && !isShooted) {
// 親子関係を解消する
transform.parent = null; // ☆ 追加
// trueにすることで条件式に入らないように制御する
isShooted = true;
transform.eulerAngles = new Vector3(0, Random.Range(30, 120), 0);
//z軸という方向(=前方向)にpowerの力を加えて打ち出す(値によってスピードが変わる)
GetComponent<Rigidbody>().AddForce(transform.forward * addSpeed);
}
}
}