//tips
//Physicsを使わないオブジェクトの落下
落下速度の細かな設定を行いたい場合はPhysicsを使わずスクリプトを使って管理することになる。
public class ItemController :MonoBehavior
{
public float dropSpeed = -0.03f;
void Update()
{
transform.Translate(0, this.dropSpeed, 0);
if(transform.position.y < -1.0f)
{
Destroy(gameObject);
}
}
}
transformで移動させる方法としては、transform.Translateとtransform.positionがあり、違いとしては、
transform.Translate:現在のオブジェクト位置を基準にして移動したいときに使用
void Update () {
if (Input.GetKey(KeyCode.UpArrow))
{
transform.Translate(0f, 0f, 0.1f);
}
if (Input.GetKey(KeyCode.DownArrow))
{
transform.Translate(0f, 0f, -0.1f);
}
if (Input.GetKey(KeyCode.LeftArrow))
{
transform.Translate(-0.1f, 0f, 0f);
}
if (Input.GetKey(KeyCode.RightArrow))
{
transform.Translate(0.1f, 0f, 0f);
}
キーボタンを押したら移動をさせるときなどにも使用できる。
transform.position:オブジェクトの座標を指定して移動。新しい場所へワープさせる。現在の座標に加算すればtransform.Translateと同じような移動も可能。
transform.position += transform.forward * 1f * Time.deltaTime;
transform.forward はオブジェクトが向いている方向のベクトル、1f * Time.deltaTimeは1 m/s の速さで処理を行う。
ちなみに、他の移動方法としてあるVector3.MoveTowards は、
public static Vector3 MoveTowards(Vector3 current, Vector3 target, float maxDistanceDelta);
「現在地」から「目的地」まで「一定速度」で移動させてくれる関数である。
オブジェクトの移動については下記参考。
https://squmarigames.com/2018/11/08/unity-beginner-translate/
//すり抜け接触での相手のオブジェクトの破棄
Physicsによる当たり判定を行うには2つの条件が必要で、
・両方のオブジェクトにColliderコンポーネントがアタッチされている
・少なくとも一方にはRigidbodyコンポーネントがアタッチされている
がある。
これにより衝突時にはOnTriggerEnterメソッドが呼び出せるようになるので、バスケットとリンゴを衝突させるとして、バスケットのほうにOnTriggerEnterメソッドを追加する。
Void OnTriggerEnter(Collider other)
{
Destroy(other.gameObject);
}
Destroyするためにはその対象を知らなければならないが、OnTriggerEnterが引数として衝突相手のColliderを返すことを利用して、collider.gameObjectとすることでgameObjectを取得できDestroyできる。
//タグを使用して接触条件を追加する
リンゴタブと爆弾タブを作り、接触条件を分岐させる。
タグはgameObject.tag == “aaa”の形で表されるのでわかりやすい。
void OnTriggerEnter(Collider other)
{
if(other.gameObject.tag == “Apple”)
{
Debug.Log(“Tag=Apple”);
}
else
{
Debug.Log(“Tag=Bomb”);
}
Destroy(other.gameObject);
}
タグの使用方法例を下記に追加する。
public class Example : MonoBehaviour
{
void Start()
{
//Set the tag of this GameObject to Player
gameObject.tag = "Player";
}
private void OnTriggerEnter(Collider other)
{
//Check to see if the tag on the collider is equal to Enemy
if (other.tag == "Enemy")
{
Debug.Log("Triggered by Enemy");
}
}
}
これらの接触分岐にデバッグではなく、音を出すようにすると
public AudioClip appleSE;
public AudioClip bombSE;
AudioSource aud;
と先にAudioClip変数を宣言しておき、
void Start()
{
this.aud=GetComponent<AudioSource>();
}
void onTrigeerEnter(Collider other)
{
if(other.gameObject.tag==“Apple”)
{
this.aud.PlayOneShot(this.appleSE);
}
else
{
this.aud.PlayOneShot(this.bombSE);
}
Destroy(other.gameObject);
}
Tagで鳴らす音を切り替えている。
//1秒間隔で自動生成されるオブジェクトが落ちてくる
復習で秒間隔で自動生成するスクリプトを確認する。
自動生成するためにはprefabから行う必要があるので、
public GameObject applePrefab;
public GameObject bombPrefab;
とおき、生成間隔をspan、計測時間をdeltaとおく。
float span = 1.0f;
float delta = 0;
void Update()
{
this.delta += Time.deltaTime;
if(this.delta > this.span)
{
this.delta = 0;
Instantiate(applePrefab);
}
}
フレームが更新されるごとにTime.deltaTimeでthis.deltaに時間が加算されていき、1秒をすぎた場合にプレファブから実体を生成し、累積時間を0に戻している。
//生成オブジェクトのランダム配置
生成オブジェクトの各座標に対してランダムな値を返したい場合、Random.Range()を使用する必要がある。
そこで先のコードを参考にすると、オブジェクトの中の数値設定も行いたいのでインスタンスを変数化して、加工しやすくしている。
void Update()
{
this.delta += Time.deltaTime;
if(this.delta > this.span)
{
this.delta = 0;
GameObject item = Instantiate(applePrefab) as GameObject;
float x = Random.Range(-1,2);
float z = Random.Range(-1,2);
item.transform.position = new Vector3(x, 4, z);
}
}
Random.Range(-1,2)とは-1<=x<2の範囲のことである。