エディタ上でトリガーを表示する
罠のためのトリガー等、ゲーム中では目に見えないものをエディタ上で表示したいことはよくある。
2Dゲーム用だとこんな感じかな。
void OnDrawGizmos()
{
var trigger = GetComponent<BoxCollider2D>();
Gizmos.DrawCube(
transform.position,
new Vector3(
trigger.size.x * transform.localScale.x,
trigger.size.y * transform.localScale.y,
0
)
);
}
邪魔な時はトリガーレイヤー非表示なんかで対応すればいいから、単純にこれくらいでいい・・・かな?
ゲーム実行時(テスト時など)にもトリガーを表示する
- 案1:スプライトを貼り付けて、不要な場合はStartで消してしまう。
- 案2:何か描画しておいて、最初にトリガーレイヤーをまとめて非表示に。
- 案3:がんばって描画する。
案3を1つのスクリプトで書いてみたらこんな感じか
public class トリガー可視化スクリプト : MonoBehaviour
{
public Color color = Color.red; //色
public bool drawOnPlaying = false; //ゲーム実行中描画スイッチ
private static Material material = null;
void Start()
{
if(drawOnPlaying == false)
return;
var width = GetComponent<BoxCollider2D>().size.x;
var height = GetComponent<BoxCollider2D>().size.y;
var meshRenderer = gameObject.AddComponent<MeshRenderer>();
var meshFilter = gameObject.AddComponent<MeshFilter>();
var mesh = new Mesh();
//メッシュ生成
mesh.name = "Trigger Mesh";
mesh.vertices = new Vector3[]
{
new Vector3(.5f*width,.5f*height,0f),
new Vector3(-.5f*width,-.5f*height,0f),
new Vector3(-.5f*width,.5f*height,0f),
new Vector3(.5f*width,-.5f*height,0f),
};
mesh.triangles = new int[]
{
0,1,2,3,1,0
};
mesh.uv = new Vector2[]
{
new Vector2(1f,1f),
new Vector2(0f,0f),
new Vector2(0f,1f),
new Vector2(1f,0f),
};
mesh.colors = new Color[]
{
color,color,color,color
};
mesh.RecalculateNormals();
mesh.RecalculateBounds();
mesh.Optimize();
//生成したメッシュを設定
meshFilter.mesh = mesh;
//マテリアルが生成されていなければ新しく生成
if(material == null)
material = new Material(Shader.Find("GUI/Text Shader"));
//マテリアルを設定
meshRenderer.material = material;
}
//--------------------------------------------
// エディタ上でトリガーを可視化するための機能
//
void OnDrawGizmos()
{
var width = GetComponent<BoxCollider2D>().size.x;
var height = GetComponent<BoxCollider2D>().size.y;
Gizmos.color = color;
Gizmos.DrawCube(
transform.position,
new Vector3(
width * transform.localScale.x,
height * transform.localScale.y,
0
)
);
}
}
まあBoxCollider2D以外のトリガー使う予定ないから、エラー出るまではこれでいいや_(:3」∠)_
ポーズ
大体のゲームで必要になる機能。
タイムスケールを0にする
Time.timeScale = 0;
これをやるだけ。ただし、Update()は呼ばれ続けるので注意。
具体的には、
- ポーズ中も止まってほしくないアニメーションも止まるはず。
- WaitForSecondsもこのスケーリングに依存しているので、それを忘れると極々まれだけどハマる。
ポーズを自分で管理する
最終更新:2016年04月20日 04:50