Unityメモ4:RaycastとButton、シーンの切り替え、UIの部品の拡大・縮小、文字の大きさ、PlayerPrefs

オリジナルゲーム作成中のUnityのメモ、その4
だいたいゲームの形ができてきた。新しいことをするのは結構疲れる。

Raycastを無視してUI Buttonだけに反応させる

Physics.Raycastを使っていてUI Buttonを押すとRaycastとUI Buttonの2つが反応してしまう。UI Buttonを押したときはRaycastを無視するようにコードをいじくる必要がある。

if(!UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject()){
	//UI Buttonが押されていたら無視される
	Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
	RaycastHit hit = new RaycastHit ();
	if (Physics.Raycast (ray, out hit)) {
		//何かする
	}
}
上記のコードはパソコンではうまくいくけど、スマートフォン上ではうまくいかない。

パソコン上でもスマホ上でも動作するコードは下記になる。
public void Hoge(){
	if (!IsPointerOverUIObject()) {
		//UI Buttonが押されていたら無視される
		Ray ray = Camera.main.ScreenPointToRay (mousePosition);
		RaycastHit hit = new RaycastHit ();
		if (Physics.Raycast (ray, out hit)) {
			//何かする
		}
	}
}

private bool IsPointerOverUIObject() {
	// Referencing this code for GraphicRaycaster https://gist.github.com/stramit/ead7ca1f432f3c0f181f
	// the ray cast appears to require only eventData.position.
	PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
	eventDataCurrentPosition.position = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
		
	List<RaycastResult> results = new List<RaycastResult>();
	EventSystem.current.RaycastAll(eventDataCurrentPosition, results);
	return results.Count > 0;
}
参考:IsPointerOverEventSystemObject always returns false on mobile

シーンの切り替え

1つのシーンにメニューやゲーム画面などを詰め込むこともできますが、ゲームが少し複雑化しそうな場合は、シーンを切り分けたほうが無難。
Application.LoadLevel("シーンの名前");

こんな感じのシーン構成にしてみる
・メニュー&ゲーム選択シーン
・設定シーン
・ゲームシーン1
・ゲームシーン2
・ゲームシーン3

Awake()とStart()の違い

Awakeが最初に呼ばれて、次にStartが呼ばれる。

Awakeはゲームの描画前に呼ばれるので初期化に使う。Awakeはオブジェクトの準備が整っていないので外部の何かを参照するときはStartでしたほうが無難。Startで表示を変更するような設定を書いたりすると実際に表示するときに変更される瞬間が入り込む場合がある。

Toggleを使うとき

Toggleを使うときはUnityEngine.UIを宣言する。
using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class HogeController : MonoBehaviour {
	public Toggle hogeToggle;
}

UIを画面にあわせて拡大・縮小する

CanvasでUIを作って、その部品のButtonやPanelなどを画面の大きさに合わせて拡大・縮小するにはRect TransformのAnchor Presets(四角が2つ入っているボタン)をstretchする。その後、AnchorsのMinとMaxを変更する。

Anchorsの初期設定
Min X:0 Y:0
Max X:1 Y:1

Min X:0 Y:0.5
Max X:0.5 Y:1.0

Left、Top、Right、Bottomを0にする。
これで画面の左上の大きさになる。

UIの文字の大きさを画面にあわせる

Best Fitにチェックを入れる。それだけ。

PlayerPrefsで簡単なデータを保存/読込する

データの保存
//intの保存
PlayerPrefs.SetInt("hogeInt", 1000);

//floatの保存
PlayerPrefs.SetFloat("hogeFloat",1.55);

//stringの保存
PlayerPrefs.SetString("hogeString","保存するよ");

データの読込
//intの読み込み、データがなければ0になる
PlayerPrefs.GetInt("hogeInt", 0);

//floatの保存
PlayerPrefs.GetFloat("hogeFloat");

//stringの保存
PlayerPrefs.GetString("hogeString");

基本的に保存できる容量の制限はないけど、Web版の場合は1MBまでになっている。簡単なデータの保存/読込は全てPlayerPrefsに任せてしまえばいい。

コメントを残す

メールアドレスが公開されることはありません。