スキップしてメイン コンテンツに移動

星避けミニゲーム「宇宙船に乗って・・・」のスクリプト紹介

少し遅れ気味ですがスクリプト紹介を。

(週末って仕事の疲れで抜け殻状態なんですよね・・・)

さて、今回紹介するスクリプトは、

星避けミニゲーム
「宇宙船に乗って・・・」

の使用スクリプトです。

役に立つ人が居るのかと聞かれたら、自分には何とも言えませんが誰かの役に立つと信じて。

内容は

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の方にリプでもとばいて貰えればと思います。

そして今後もゲーム制作のスクリプトはこうしてブログにしていくので、またどうぞよろしくお願いします!

それでは、今日はこの辺で。

また明日!

コメント

このブログの人気の投稿

3DCADでゲーム用の銃を作っていく ~活動報告190925~

3DCADのFusion360を使って、銃の3Dモデルを作ります。 どうも、kou0128です。 昨日、思ったよりもガチャゲーの制作に時間がかかる事が判明し、VRの制作に戻ります。 まずは、3DCADでモンスターを撃つ銃のモデルを作っていきます。 使うのはFusion360という3DCADソフトです。 作ってる途中の画像じゃなく、いきなり原型が出来てしまってますが・・・ 使い方はを細かく紹介するブログと動画は、また作ります。 さて原型を作りましたが、もう少し銃っぽさを出していきます。 グリップ部分チェッカリングを付けていきます。 実際の拳銃でも滑り止めについていることが多いし、平面な部分を減らしていくことでのっぺり感を減らせるんじゃなかろうかという感じです。 グリップのチェッカリングと、スライドの分割溝を付けることで、一気にのっぺり感が減りました。 ただ、今回作ったモデルはゲーム中にサイト覗きっぱなしなので、サイドのデザインは関係ないという。 やっぱり作るならクオリティにこだわりたいじゃないですか。 今後の練習と思えば、全然苦になりません。 サイドにデカールを貼ってみました。 簡単に絵を張り付ける機能も標準で搭載されているので、3D上でモデルとステッカーのあわせが試せるという使い方が出来ます。 3Dプリンタでモデルを出して、プリンターでシールを印刷すれば実物で再現できそう。 うーん、やっぱり3DCADでモデル作ると3Dプリンタで出してみたいという思いにもなります。 やっぱり買おうかなぁ・・・・ 閑話休題 Windows10搭載のペイント3Dで色を塗ってみました。 これでテクスチャデータが書き出せたら、神ソフトなのですが試してみた感じ、全然上手い事行きません。 やっぱりBlenderで色を付けるしかないですね・・・ そんな訳でBlenderに取り込みます。 BlenderのUV展開で色を付けることできないかなぁ・・・と以前から考えてますが、何故かペイント機能が出ない。 というか、そもそもUV展開された状態が...

SL230~リアブレーキ&シフトペダルの調整~

今回は以前より自分のライディングポジションに合わなかった、 リアブレーキペダル&シフトペダルの位置調整をしていきます。 まずは、リアブレーキの調整からしていきます。 はい、調整後です。 調整方法はいたって簡単です。 この金色のナットの位置調整をして終わりです。 ね?簡単でしょ? 流石に詳しく説明をします。 1. まず、下のねじの山を確認し、金色のナットとステン(?)のナットが近づく方と離れる方を確認します。 2. でペダルを下げたい場合は、近づく方向に回し、上げたい場合は離れる方向に回すだけです。 説明終わり。 リアブレーキペダルの調整は恐ろしく簡単でした。 注意点としては、 1. 電気をONにしてブレーキを踏んだ時、ブレーキーランプが点きっぱなしにならない事に確認する。(点きっぱなしだと、「整備不良」でお巡りさんに捕まるよ!) 2. ブレーキを踏んでいない時に、ブレーキパッドとブレーキディスクが当たってないか確認する。 この二つを確認して、試し乗りして問題なければ終了です。 これで、長距離でも疲れにくくなりましたね。 さて、次はシフトペダルの調整をしていきましょう。 シフトペダルの調整は本来、この 二つのナットの位置を変えて調整しますが、今回は、 元の接続部のとこから変えていきます。 それでは説明を。 1. まず、シリコンスプレーを吹いて、ねじを緩めます。 2. シフトペダルは横方向に遊びが有るので、そのまま取り外し。 3. ここから位置を決めながら、少しづつ角度を変えていきます。(かなり大きく変化するので良い位置を見つけるのは難しいよ) 4. で、位置が決まったらねじを付けて固定です。(締め過ぎ注意、なめたら詰みだよ!) で、あとは試し乗りして気に要らなけりゃ、変えてまた試し乗りという流れですね。 これでシフトペダルの調整は終了です。 自分がした感じだとブレーキペダルは簡単でしたが、シフトペダルは少し面倒かなという印象です。 今回自分がしたときは、...

SL230のインプレッションです!

SL230のインプレッションです! HONDAの SL230 (正確には223cc ) です。 (正確には223ccです。) 大切なことなので二回言いました。 さあ、そんなSL230ですが。 1997年から製造されてた250ccクラスのオフロードバイクです。 まず乗った感じとしては、 凄く乗りやすいです。 平地で有ればアクセルを回してなくても、クラッチをゆっくり繋げば発進出来ますからね。 免許を取って7ヶ月経った下手くそな私でも200km走ってエンスト無しです! 凄くトルクの太さを実感できます。 しかし、ロングストロークエンジンで単気筒なので、どんなに飛ばしても「ぬわわkm」が限界だと思います。 出したことは無いので分かりませんが。 装備面は、標準で リアキャリア と ナックルガード が装備されています。 この通り、早速46Lのリアボックスを付けております。 オフロードバイクだと、ネイキッドやフルカウルに比べ、違和感が少なくて良いですね。 (安全の為に、プロテクターは常に着用してますよ。) ナックルガードは今の時期だと、手に虫が当たらない位しかメリットが有りませんが、 冬場は必需品です! どうしても冷たい風で手が冷え、操作に支障をきたしがちですが、ナックルガードが有るなら心配はいりませんね! さて、続いてはハンドル回りです。 メーターは、速度計のみで、タコメーターは有りません。ここは少し残念です。 それ以外は、オドメーター、トリップメーター、ニュートラルランプ、ウインカーランプ、ハイビームランプです。 燃料計が欲しいです。 今日、山に登って写真を撮った帰りに、山道で何故かエンジンが停止。 押し掛けをしてもエンジンがかからず、困り果てていると、 リザーブの高さになっていただけでした(×0×) 燃費さえ分かってしまえば、トリップメーターで見れなくはないですが、それでも焦りますね。 続いて、ハンドル左側です。 キャブレター車なので、クラッチ横にチョークレバーが有ります。 冬場などは必須なので、この位置に有るのは嬉しいですね。 そして、ライトのロー・ハイ、ウインカー、ホーンが有ります。 ホーンの音...