にしのクエスト2

情報処理技術者試験と資格学校講師の日常

20221224103753

Unityで学ぶプログラミング (初心者)寸止めゲームを作ろう(最終回)ハイスコアの記録

上から落ちてくるブロックを床の上で寸止めして、ギリギリを
狙うゲーム最終回です。

応用すれば、いろんなゲームに使えそうな技術が多くあるので、
是非勉強してみてください。

初心者向きとは書いていますが、ざっくりなところもあります。
ご容赦ください。わからなければ、質問してくださいね。
(TwitterとかでもOKですよ)

今日もGameCのプログラムを改造していきます。

最終回ですね!「ハイスコアの記録」をさせます。

 

一応、GameCの完成版を全部載せておきますね。

public class GameC : MonoBehaviour
{
//記録する変数
float Score;

//最高記録を保管する変数
float MaxScore=5.0f;
 
最初にスコアを表示する変数と、最高記録を表示する変数を書いておきます。
最高記録の値には高さを設定しておきます。一回目は常に最高記録更新にします。


//落下オブジェクトを格納する変数
GameObject ObjA;

//落下オブジェクトのRigidbodyを格納する変数
Rigidbody ObjARigid;
 
//フラグ
public int missFlag=0;
 
//3DTextを格納する変数
GameObject Mes;

//テキストを格納する変数
TextMesh MesTM;

void Start()
{
//落下オブジェクトを取得
ObjA=GameObject.Find("ObjectA");

//落下オブジェクトのRigidbodyを取得
ObjARigid=ObjA.GetComponent<Rigidbody>();
 
//テキストを取得
Mes=GameObject.Find("Message");

//テキストのテキストメッシュを取得
MesTM=Mes.GetComponent<TextMesh>();
}

void Update()
{
//スペースキーを押すと
if(Input.GetKey(KeyCode.Space))
{
//重力を切る
ObjARigid.useGravity = false;

//加速度をなくす
ObjARigid.velocity = Vector3.zero;
 
//スコアを保存
Score=ObjA.transform.position.y-0.5f;
 
この辺りからが新しいところかな?

//もし、最高記録を更新したら
if(MaxScore>Score){
//スコアを記録する
MaxScore=Score;
//距離を表示
MesTM.text="最高記録更新!"+Score;
}

//もし、最高記録を更新していなければ
if(MaxScore<Score){
//距離を表示
MesTM.text="地面まで"+Score;
}
 
最高記録を更新した場合と、
していない場合の両方の判定式を書きます。

あとで気がついたのですが、失敗フラグが立っていない場合のみ
最高記録を確認するようにしても良かったかもです。
if(MaxScore>Score&&MissFlag==0)
みたいな感じで。


//再開の処理2秒後に
Invoke("Mokkai",2.0f);

}

//ミスフラグが立った場合テキストを更新
if(missFlag==1)
{
//失敗メッセージ
MesTM.text="失敗!";

//重力を切る
ObjARigid.useGravity = false;

//加速度をなくす
ObjARigid.velocity = Vector3.zero;
 
//フラグを戻す
missFlag=0;
 
//再開の処理2秒後に
Invoke("Mokkai",2.0f);
 
}
}

void Mokkai(){
 
//メッセージ
MesTM.text="もう一度";

//物体の高さを戻す
ObjA.transform.position=new Vector3(0,5,0);
 
//重力をon
ObjARigid.useGravity = true;

//スコアのリセット
Score=0;
}

}


というわけで、小さなゲームを作ってみました。
是非、いろいろと改造して自分なりの工夫を付け加えてください。


それではよきプログラミングライフを!
またね。

日々是ネットワーク #5 パス付きZIPってどうしてダメなん?

今回は、ネットとはちょっと違うかもです(w

www.itmedia.co.jp


こんな記事が出てましたね。

さて、ここはそういえば情報処理技術者試験のページでしたね。
こほん。では問題です。

なぜ、パス付きZIPファイルはセキュリティ
上ダメなのでしょうか?3点挙げよ。

ちゃんと答えられるかな?

1 そもそも暗号化じゃないから

ZIPはアーカイバなので、データを圧縮しているだけです。
中身を解析して、覗くことは十分可能です。

2 内部構造を見ることができるから

パスワードがわからないので、解凍することはできなくて
も。圧縮されているファイルの構造や、ファイル名は見る
ことができます。よって、ファイルの名前によっては内容
の推測もできますね。

3 パスワード試行回数に制限がないから

なので、ダウンロードして、何回もアタックすれば必ず解
けてしまいます。そういうソフトもあるくらいでございま
す。

4 送られてくるパスワードは平文

もう一つ書くとすれば、別便のパスワードは暗号化されて
ないパターン多すぎですよね。

盲信的ですよね

要するにパスZIPは「なんとなく、安全なような気がする・・・」
というだけで、全く意味がないのにもかかわらず盲信的に安全策
として採用され続けてきた悪癖です。

これが技術的にきちんと見直されて、やめようっていう動きが出
てきたのは当然と言えばそうですが、お役所にしてはやるじゃん!
って思いますね。

ではでは。

f:id:koharuwest:20200724151322p:plain

Unityで学ぶプログラミング (初心者)寸止めゲームを作ろう(5)衝突後の処理

上から落ちてくるブロックを床の上で寸止めして、ギリギリを
狙うゲーム5回目です。

応用すれば、いろんなゲームに使えそうな技術が多くあるので、
是非勉強してみてください。

初心者向きとは書いていますが、ざっくりなところもあります。
ご容赦ください。わからなければ、質問してくださいね。
(TwitterとかでもOKですよ)

今日はGameCのプログラムを改造していきます。

今日は「衝突した後の処理」をさせます。

//落下オブジェクトを格納する変数
GameObject ObjA;

//落下オブジェクトのRigidbodyを格納する変数
Rigidbody ObjARigid;
 
//フラグ
public int missFlag=0;
 
//3DTextを格納する変数
GameObject Mes;

//テキストを格納する変数
TextMesh MesTM;

void Start()
{
//落下オブジェクトを取得
ObjA=GameObject.Find("ObjectA");

//落下オブジェクトのRigidbodyを取得
ObjARigid=ObjA.GetComponent<Rigidbody>();
 
//テキストを取得
Mes=GameObject.Find("Message");

//テキストのテキストメッシュを取得
MesTM=Mes.GetComponent<TextMesh>();
}

void Update()
{
//スペースキーを押すと
if(Input.GetKey(KeyCode.Space))
{
//重力を切る
ObjARigid.useGravity = false;

//加速度をなくす
ObjARigid.velocity = Vector3.zero;

//距離を表示
MesTM.text="地面まで"+(ObjA.transform.position.y-0.5f);
 
//再開の処理2秒後に
Invoke("Mokkai",2.0f);

}

最後から2行目だけ追加してます。

スペースキーを押して、無事止まった場合、
Invokeを利用して、2秒後にもう一度プレイを再開させます。

さらにその後に追加

//ミスフラグが立った場合テキストを更新
if(missFlag==1)
{
//失敗メッセージ
MesTM.text="失敗!";

//重力を切る
ObjARigid.useGravity = false;

//加速度をなくす
ObjARigid.velocity = Vector3.zero;
 
//フラグを戻す
missFlag=0;
 
//再開の処理2秒後に
Invoke("Mokkai",2.0f);
 
}
}
衝突した場合、スコアは表示せずに
再度のプレイに移行させます。
 

void Mokkai(){
 
//メッセージ
MesTM.text="もう一度";

//物体の高さを戻す
ObjA.transform.position=new Vector3(0,5,0);
 
//重力をon
ObjARigid.useGravity = true;
}

これを追加しておきます。

うまく行っても失敗しても、これが実行されて
オブジェクトは再び上へ移動し、落下を再開します。

次回は最終回です。

・最高記録の更新!


それではよきプログラミングライフを!
またね。

Unityで学ぶプログラミング (初心者)寸止めゲームを作ろう(4)床への衝突検知

上から落ちてくるブロックを床の上で寸止めして、ギリギリを
狙うゲーム4回目です。

応用すれば、いろんなゲームに使えそうな技術が多くあるので、
是非勉強してみてください。

初心者向きとは書いていますが、ざっくりなところもあります。
ご容赦ください。わからなければ、質問してくださいね。
(TwitterとかでもOKですよ)

早速、プログラムを作成して(C#)
ObjectAにObjCというプログラムをアタッチします。

f:id:koharuwest:20201123224113p:plain
アタッチされているかどうかは

f:id:koharuwest:20201123224507p:plain

インスペクタにもありますので、確認しましょう。

今日は「地面にぶつかったらGameDirectorに報告」させます。


//GameDirector格納用
GameObject GD;
//GameC格納用
GameC GDC;
 
void Start()
{
//GameDirectorを取得
GD=GameObject.Find("GameDirector");
//こうすると、GameCのプログラムに関与できる
GDC=GD.GetComponent<GameC>();
}
やっていることは、前回と同じなのですが。
GameDIrecctorに報告するため、GameDrictorを発見し、
さらにアタッチされているGameCも見つけておきます。

そうすることで、GameCの中にいるmissFlagという変
数にこのプログラムからアクセスできるようにしています。
//床と衝突したら
void OnCollisionEnter(Collision col){
if(col.gameObject.name=="Field"){
//フラグを返してあげる
GDC.missFlag=1;
}
}

そして、衝突した場合はその対象のデータをcolに入れて返してく
るのですが、その中の名前はFieldだった場合、missFlagを1にし
て返します。

これで、途中でストップをかけれずに衝突したことを
GameDirectorに報告できます。

次回は、これを使って、GameCを編集していきます。

・衝突したら、どういう処理を行うか

・そして、元の位置に戻して再スタート!

まで行ってみたいと思います。

それではよきプログラミングライフを!
またね。