少し遅れ気味ですがスクリプト紹介を。
(週末って仕事の疲れで抜け殻状態なんですよね・・・)
さて、今回紹介するスクリプトは、
星避けミニゲーム
「宇宙船に乗って・・・」
の使用スクリプトです。
役に立つ人が居るのかと聞かれたら、自分には何とも言えませんが誰かの役に立つと信じて。
内容は
1.スタンダードアセットのコントローラーを使ったプレーヤー(宇宙船)のスクリプト
2.避ける星のスクリプト
3.星をランダムに生み出すスクリプト
4.ステージ中のタイマーとそのセーブのスクリプト
5.リザルト画面でのタイマーの時間表示のスクリプト
以上、5つとなっています。
では、まず一つ目。宇宙船のスクリプト。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityStandardAssets.CrossPlatformInput;
public class Player : MonoBehaviour {
private AudioSource[] sources;
private float countTime;
private int X;
void Start(){
sources = gameObject.GetComponents<AudioSource>();
X = 0;
}
private void Update(){
float h = CrossPlatformInputManager.GetAxis("Horizontal");
float v = CrossPlatformInputManager.GetAxis("Vertical");
transform.position += new Vector3 (0.05f*h,0.05f*v, 0.0f);
if (X == 1) {
countTime += Time.deltaTime;
if(countTime >= 0.3){
SceneManager.LoadScene ("SceneEND");
}
}
}
public void OnCollisionEnter2D(Collision2D collision){
if (collision.gameObject.tag == "hoshi") {
FindObjectOfType<Timer> ().Save ();
sources[0].Play();
X = 1;
}
}
}
特に今回新しく追加したものがこれ。
using UnityStandardAssets.CrossPlatformInput;
float h = CrossPlatformInputManager.GetAxis("Horizontal");
float v = CrossPlatformInputManager.GetAxis("Vertical");
transform.position += new Vector3 (0.05f*h,0.05f*v, 0.0f);
これは、スタンダードアセットのコントローラーのインプットを取得し、このプログラムを付けたアイテムの位置を変更するという物です。
恐らくusingの部分で他スクリプトの参照をしているのだと思われます。
いや、自分も元のスタンダードスクリプトの中身を眺めて、「これかな~」という感じにやって動いてるだけなので詳しい事は分からないという。
でスタンダードアセットのインプットに有るデータ「Horizontal」「Vertical」、横方向と縦方向の入力を取ってきているわけだ。
簡単に言えば上の3行で、スタンダードアセットのクロスプラットフォームインプットが使える訳だ。
ぶっちゃけアプリ制作にはかなり便利な物かと。
続いて、流れる星のスクリプト。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class hoshi : MonoBehaviour {
private float time;
void Update () {
transform.position += new Vector3 (0.0f, -1.5f*Time.deltaTime, 0.0f);
time += Time.deltaTime;
}
public void OnCollisionEnter2D(Collision2D collision){
if (collision.gameObject.tag == "Finish") {
Destroy(gameObject);
}
}
}
凄い簡単に言うとUpdateの度に、時間×-1.5にして、画面上部から落ちてくるようにし、フィニッシュオブジェクトにぶつかると消えるという物だ。
ステージ外に延々と残すのも動作影響が出るので、これが一番良いと思う。
動作には、星自身にRigid Body2Dを付けて、Gravity(重力)を0にしてる。
重力の加速する落ち方で良いなら、当たり判定のみあれば良いです。
続いて、ランダムに星を出す方法。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RandomBorn : MonoBehaviour {
public GameObject hoshi1;
public GameObject hoshi2;
public GameObject hoshi3;
public float timeOut;
private float timeElapsed;
private int X;
void Start(){
X = 0;
}
void Update() {
timeElapsed += Time.deltaTime;
if (timeElapsed >= timeOut) {
X = X+1;
if (X == 1) {
// 動作させたいこと
int random1 = Random.Range (0, 2);
int random2 = Random.Range (0, 2);
int random3 = Random.Range (0, 2);
int random4 = Random.Range (0, 2);
int random5 = Random.Range (0, 2);
timeElapsed = 0.0f;
X = 0;
if (random1 == 0) {
int random11 = Random.Range (0, 3);
if (random11 == 0) {
//配置
Instantiate (hoshi1);
hoshi1.transform.position = new Vector3 (-2, 4, 0);
}
if (random11 == 1) {
//配置
Instantiate (hoshi2);
hoshi2.transform.position = new Vector3 (-2, 4, 0);
}
if (random11 == 2) {
//配置
Instantiate (hoshi3);
hoshi3.transform.position = new Vector3 (-2, 4, 0);
}
}
if (random2 == 0) {
int random21 = Random.Range (0, 3);
if (random21 == 0) {
//配置
Instantiate (hoshi1);
hoshi1.transform.position = new Vector3 (-1, 4, 0);
}
if (random21 == 1) {
//配置
Instantiate (hoshi2);
hoshi2.transform.position = new Vector3 (-1, 4, 0);
}
if (random21 == 2) {
//配置
Instantiate (hoshi3);
hoshi3.transform.position = new Vector3 (-1, 4, 0);
}
}
if (random3 == 0) {
int random31 = Random.Range (0, 3);
if (random31 == 0) {
//配置
Instantiate (hoshi1);
hoshi1.transform.position = new Vector3 (0, 4, 0);
}
if (random31 == 1) {
//配置
Instantiate (hoshi2);
hoshi2.transform.position = new Vector3 (0, 4, 0);
}
if (random31 == 2) {
//配置
Instantiate (hoshi3);
hoshi3.transform.position = new Vector3 (0, 4, 0);
}
}
if (random4 == 0) {
int random41 = Random.Range (0, 3);
if (random41 == 0) {
//配置
Instantiate (hoshi1);
hoshi1.transform.position = new Vector3 (1, 4, 0);
}
if (random41 == 1) {
//配置
Instantiate (hoshi2);
hoshi2.transform.position = new Vector3 (1, 4, 0);
}
if (random41 == 2) {
//配置
Instantiate (hoshi3);
hoshi3.transform.position = new Vector3 (1, 4, 0);
}
}
if (random5 == 0) {
int random51 = Random.Range (0, 3);
if (random51 == 0) {
//配置
Instantiate (hoshi1);
hoshi1.transform.position = new Vector3 (2, 4, 0);
}
if (random51 == 1) {
//配置
Instantiate (hoshi2);
hoshi2.transform.position = new Vector3 (2, 4, 0);
}
if (random51 == 2) {
//配置
Instantiate (hoshi3);
hoshi3.transform.position = new Vector3 (2, 4, 0);
}
}
}
}
}
}
めっちゃ長いですが、恐らくこれも省略できそうな気がする。
スクリプトで、指定時間に一度のみ実行させる判定をifで書き、その後5か所の出現有り無しをランダム選択後、各場所に入るものをランダムで選んでいるという物です。
注意すべき点は、指定時間に一度のさせる処理を忘れない事。
void Update() {
timeElapsed += Time.deltaTime;
if (timeElapsed >= timeOut) {
X = X+1;
if (X == 1) {
// 動作させたいこと、判定リセット
X = 0;
これを忘れUpdateに直接書けば、延々と星が増殖されます。
で、ここに来て気が付きました。
今回の場合指定時間を超えていればいいので、
void Update() {
timeElapsed += Time.deltaTime;
if (timeElapsed >= 1) {
X = 0;
これで大丈夫ですね。
このスクリプト自体、音楽ゲーム用に、フレーム判定まで考えシビアにしようとした時に作ったものなので、その違いに気が付けてなかったです。
さて、続いてタイマーとセーブ。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Timer : MonoBehaviour {
public static float countTime;
public static float clearHighTime;
public UnityEngine.UI.Text TimeText;
public UnityEngine.UI.Text HighTimeText;
public static string highScoreKey = "highScore";
void Start () {
countTime = 0;
clearHighTime = PlayerPrefs.GetFloat (highScoreKey, 0);
}
void Update () {
countTime += Time.deltaTime;
if (clearHighTime < countTime) {
clearHighTime = countTime;
}
TimeText.text = countTime.ToString ("F2");
HighTimeText.text = clearHighTime.ToString ("F2");
}
public void Save ()
{
// ハイスコアを保存する
PlayerPrefs.SetFloat (highScoreKey, clearHighTime);
PlayerPrefs.Save ();
}
public static float countTimeget()
{
return countTime;
}
public static float countHighTimeget()
{
return clearHighTime;
}
}
ま、こんな感じ。
タイマーは0.00単位まで表示で、ハイスコアを越えたらスコアをハイウコアにいれる。
そんで後は、ゲーム終了時にセーブと。
セーブに関しては、Unityの基本システムらしいので、特に別で設定はいらないかと。
最後にハイスコアの表示。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class TimeHyouji : MonoBehaviour {
public UnityEngine.UI.Text Time;
public UnityEngine.UI.Text HighTime;
private float cleartime;
private float clearHighTime;
// Use this for initialization
void Start () {
float cleartime = Timer.countTimeget();
Time.text = cleartime.ToString("F2");
float clearHighTime = Timer.countHighTimeget ();
HighTime.text =clearHighTime.ToString("F2");
}
}
簡単すぎんかこれ。
前のシーン、つまるところタイマーを使ったステージのsceneで両方とも数字が作られてる&呼び出されてるので、特にここでは表示のみ。
Time.text = cleartime.ToString("F2");
このF2の部分が0.00表示の意味、F1なら0.0、F0なら0となる訳です。
さて、今回は星避けゲーム「宇宙船に乗って・・・」のスクリプトを紹介してきましたが、いかがでしたでしょうか。
正直、「思い通りに動けばいいや」でげーむを作っているので、スクリプトのもっと効率の良い書き方等も有ると思いますので、その辺は自分で探してください。
またスクリプトで分からない事が有れば、Twitterの方にリプでもとばいて貰えればと思います。
そして今後もゲーム制作のスクリプトはこうしてブログにしていくので、またどうぞよろしくお願いします!
それでは、今日はこの辺で。
また明日!