マウスで選択したオブジェクトの色を変更する(RayCast)

画面に表示されているオブジェクトにマウスを当てると、オブジェクトの色が変わるスクリプトを作ってみた

using UnityEngine;
using System.Collections;
public class RayCast : MonoBehaviour {
void Start() {
}
void Update() {
//カメラ上にあるマウスの位置に飛ばすレイを作成する
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//レイがコライダーに当たった場合に情報を格納する
RaycastHit hit = new RaycastHit();
//作成したレイを投げる。コライダーに当たった場合はtrueが返る
if (Physics.Raycast(ray, out hit))
{
//レイが当たったオブジェクトがChangeColorコンポーネントをアタッチしていた場合、フラグをtrueにする
if ( hit.collider.gameObject.GetComponent<ChangeColor>() ) {
hit.collider.gameObject.GetComponent<ChangeColor>().select_flg = true;
}
}
}
}
view raw RayCast.cs hosted with ❤ by GitHub

マウス位置のレイを投げるスクリプト(RayCast.cs)を空のGameObjectにアタッチする

using UnityEngine;
using System.Collections;
public class ChangeColor : MonoBehaviour {
//選択判別用フラグ
public bool select_flg;
//選択時の色変更用
private Color default_color;
private Color select_color;
//色変更対象のオブジェクトのマテリアル格納用
protected Material mat;
void Start () {
//フラグ、色、マテリアルの初期化
select_flg = false;
default_color = Color.gray;
select_color = Color.red;
mat = this.gameObject.GetComponent<Renderer>().material;
}
void Update () {
mat.color = default_color;
//フラグがtrueの場合(RayCast.csで変更される)
if (select_flg) {
//選択から外れたとき用
select_flg = false;
//オブジェクトの色を変更する
mat.color = select_color;
}
}
}
view raw ChangeColor.cs hosted with ❤ by GitHub

オブジェクトの色を変更するスクリプト(ChangeColor.cs)を対象のオブジェクトにアタッチする(ここではCubeのPrefab)

00008

イベント関数の呼び出し順を確認してみる

イベント関数(Start,Awake,Update,FixedUpdate,LateUpdate)がそれぞれどのタイミングで呼ばれるのか確認してみた

using UnityEngine;
using System.Collections;
public class CheckEvent : MonoBehaviour {
private int i = 1; //Awake用
private int j = 1; //Start用
private int k = 1; //Update用
private int l = 1; //FixedUpdate用
private int m = 1; //LateUpdate用
void Awake () {
Debug.Log("Awake Start! : " + i);
Debug.Log("Awake End! : " + i);
i++;
}
void Start () {
Debug.Log("Start Start! : " + j);
Debug.Log("Start End! : " + j);
j++;
}
void Update () {
Debug.Log("Update Start! : " + k);
Debug.Log("Update End! : " + k);
k++;
}
void FixedUpdate()
{
Debug.Log("FixedUpdate Start! : " + l);
Debug.Log("FixedUpdate End! : " + l);
l++;
}
void LateUpdate()
{
Debug.Log("LateUpdate Start! : " + m);
Debug.Log("LateUpdate End! : " + m);
m++;
}
}
view raw CheckEvent.cs hosted with ❤ by GitHub

ログを確認した結果

  • AwakeがStartの前に実行される
  • Startの後、UpdateとFixedUpdateが実行される
  • Updateの後、必ずLateUpdateが実行される
  • UpdateとFixedUpdateは別々に呼ばれ、同期はしていない
  • フレーム毎の処理はUpdate,LateUpdateを使用
    物理挙動毎の処理はFixedUpdateを使用
    という形で明確に使い分けた方が良さそう…?

    時間経過で太陽が動くようにする

    太陽を動かすには配置されているDirectional Lightを回転させるだけで実現できる

    using UnityEngine;
    using System.Collections;
    public class MoveSunLight : MonoBehaviour {
    private GameObject obj;
    void Start () {
    //設置されているDirectional Lightを取得する
    obj = GameObject.Find("Directional Light");
    }
    void Update () {
    //1フレーム毎に1度ずつ回転させる
    obj.transform.Rotate(0,1,0);
    }
    }
    view raw MoveSunLight.cs hosted with ❤ by GitHub

    00007

    uGUIでポーズボタンを実装する

    ボタンを追加する

    まず、Create > UI > Canvas でCanvasを生成
    その後、Canvas以下にCreate > UI > Button でButtonを生成
    0000100002

    Button以下のTextのTextコンポーネントの文字列を変更
    00003

    画面左下にボタンが表示される
    00004

    ポーズ用スクリプトを作成

    ボタンが押されると、Time.timeScaleを変更するスクリプトを作成

    using UnityEngine;
    using System.Collections;
    public class PauseButton : MonoBehaviour {
    void Start () {
    }
    void Update () {
    }
    public void onClick() {
    //Time.timeScale=0の場合停止する
    if (Time.timeScale == 0) {
    Time.timeScale = 1;
    } else {
    Time.timeScale = 0;
    }
    }
    }
    view raw PauseButton.cs hosted with ❤ by GitHub

    作成したスクリプトをButtonオブジェクトにアタッチして、ボタンを押した際のイベントを設定する
    ここでは作成したPauseButtonのonClick()を指定
    00005

    実行中にボタンを押してみると、ポーズ状態になっている
    しかし、フレーム自体は経過している為、フレーム毎にオブジェクトを生成したり動かしている場合は処理が動き続けるので注意
    00006

    オブジェクトを削除する

    Destroyで対象のオブジェクトを削除する

    using UnityEngine;
    using System.Collections;
    public class DestroyObject : MonoBehaviour {
    void Start () {
    }
    void Update () {
    Debug.Log(this.transform.position.y);
    //指定の位置より下に移動した場合、オブジェクトを削除する
    if (this.transform.position.y <= -3)
    {
    //自身のオブジェクトを削除する
    Destroy(this.gameObject);
    //削除する秒数も指定可能
    //Destroy(this.gameObject, 1);
    //コンポーネントの削除も可能
    //Destroy(this..GetComponent<Rigidbody>());
    }
    }
    }

    上記のスクリプトは一定の位置まで落ちたオブジェクトを削除している
    DestroyObject