キリンめも(技術)

記事を書いています #rails #swift #JS #UE4 #unity

じゃんけんゲームレベル3

完成品
じゃんけんゲーム最終形態。
じゃんけんの結果を表示

f:id:geta206:20170926143129j:plain

using UnityEngine;
using UnityEngine.UI;


public class game : MonoBehaviour {
	 Image gamebtn_;
	Text result_;
	public Sprite Img0;
	public Sprite Img1;
	public Sprite Img2;
	public int a;
	public int b;


	// Use this for initialization
	void Start () {
		// 対象を探す
		var botan = GameObject.Find ("gamebtn").GetComponent<Button> ();
		gamebtn_ = GameObject.Find ("jankenimg").GetComponent<Image> (); //画像表示用
		result_ = GameObject.Find ("result").GetComponent<Text> (); //
		var Rock= GameObject.Find ("Rock").GetComponent<Button> ();
		var paper= GameObject.Find ("paper").GetComponent<Button> ();
		var scissors = GameObject.Find ("scissors").GetComponent<Button> ();

	botan.onClick.AddListener (delegate {
		   
            //関数を作る				
          void randomjpg(){
	//////////////////////

			Debug.Log ("押");
			// コンポーネントからImageを取得

			//ランダム
			//aの値を書き換えてみた$
			int a = Random.Range (0, 3);
			//※整数1から6のどれかになる
			Debug.Log (a);

			if(a == 0 ){
				gamebtn_.sprite = Img0;

			}else if(a == 1){
				gamebtn_.sprite = Img1;
				//		buttonImage_.sprite = GameObject.Find("janken-1.jpg");
			}else{
				//Sprite image = Resources.Load<Sprite>("Images/Img0");
				gamebtn_.sprite = Img2;
				//		buttonImage_.sprite = GameObject.Find("janken-0.jpg");
			}


			///////////////////// 
}


		 //0 グー
		Rock.onClick.AddListener (delegate {
                     randomjpg();

			if (a== 1) {
				result_.text = "勝ち";
					
			} else if (a ==2) {
				result_.text = "負け";
				
			} else {
				result_.text = "あいこ";
			}
		});
		//2
			paper.onClick.AddListener (delegate {

			 randomjpg();

			if(a == 0){
					result_.text = "勝ち";
	
			}else if(a == 1){
					result_.text = "負け";

				}else{
					result_.text = "あいこ";
				}
			});

		//1
		scissors.onClick.AddListener (delegate {

		 randomjpg();

				if(a == 2){
					result_.text = "勝ち";

				}else if(a ==0){
					result_.text = "負け";

				}else{
					result_.text = "あいこ";
				}
			});


	  });
	}
	// Update is called once per frame
	void Update () {
	}
}

Unity入門その2「じゃんけんゲーム レベル1-2」

画像をGUIに出すのが鬼畜だったのでメモ。
全レベル1から3まであります
[次回レベル3を記載予定]

じゃんけんゲーム(レベル1)

お題内容
ボタンを押したら、ランダムで1~3のどれかになるプログラムを作って
次に、1ならぐーの画像、2ならちょきの画像、3ならパーの画像を表示
 (制限時間20分)

f:id:geta206:20170922161857j:plain
完成イメージ

手順1

1.上記のUIを作る  (Image)
2.機能設定 (Add Component)

1. UI作成

Hierarchy→Create → Image を選択
詳しくはこちらの記事へどうぞ↓
Unity入門その1(基本編)「ボタン実装/ランダム・乱数1/絶対指定・相対指定」 - キリンめも(技術)
見た目はこれで完成です。

2. Add Component

・Button (on click 追加ボタンを押す + )

手順2 (画像取り込み)

Project → Assets (アイコンがファイル)の上を右クリック
inport New Assetsをクリック → 画像選択
f:id:geta206:20170923013817p:plain



手順3

コードを書く

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class janken : MonoBehaviour {

	//0.使用するものの準備
	Image gamebtn_; //UIでつけた名前を記載する

	public Sprite Img0;
	public Sprite Img1; 
	public Sprite Img2; 

	void Start () {
		// 1.対象を探す
		var botan = GameObject.Find("btn").GetComponent<Button>();//0と同じ名称
		gamebtn_ = GameObject.Find ("img").GetComponent<Image> ();//UIのイメージの名前と同じ

		botan.onClick.AddListener (delegate {
			Debug.Log("押");
			//2.整数0から2をランダム
			int a = Random.Range(0,3); 
			Debug.Log(a);

			if(a == 0){
				gamebtn_.sprite = Img0;
			}else if(a == 1){
				gamebtn_.sprite = Img1;
			}else{
				gamebtn_.sprite = Img2;
			}

		});
	}

	void Update (){
	}
}

手順4

1. コードファイルに画像を指定する

Img 0...2に画像を入れる
Project → Assets → C#ファイルをクリック Img1のSelect をクリック
f:id:geta206:20170923213518p:plain

2. アタッチの方法

オブジェクトにコンポーネントをアタッチ(くっつけること)するという。

作ったC#ファイルをドラッグし、UIオブジェクトの上で離す。
以下のように追加されていれば大丈夫です。

f:id:geta206:20170923221316p:plain

3. もう一つオブジェクトを追加

同様にbtnにも手順1からUI設定を行う。

おまけ (レベル2)

お題内容
以下の画像をクリックするとランダムでじゃんけんの画像が表示される。


f:id:geta206:20170923012119p:plain

コードはこちら

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class janken : MonoBehaviour {

	//0.使用するものの準備
	Image gamebtn_; //UIでつけた名前を記載する

	public Sprite Img0;
	public Sprite Img1;
	public Sprite Img2;

	void Start () {
		// 1.対象を探す
		var botan = GameObject.Find("img").GetComponent<Button>();//0と同じ名称
		gamebtn_ = GameObject.Find ("img").GetComponent<Image> ();//UIのイメージの名前と同じ

		botan.onClick.AddListener (delegate {
			Debug.Log("押");
			//2.整数0から2をランダム
			int a = Random.Range(0,3); 
			Debug.Log(a);

			if(a == 0){
				gamebtn_.sprite = Img0;
			}else if(a == 1){
				gamebtn_.sprite = Img1;
			}else{
				gamebtn_.sprite = Img2;
			}

		});
	}

	void Update (){
	}
}
あとがき

社員さんのアドバイスもあり、完成することができました。感謝です✨
次回のゲーム作成は「もぐら叩きゲーム」を作る予定。

Unity入門その1(基本編)「ボタン実装/ランダム・乱数1/絶対指定・相対指定」

unityを何ヶ月かぶりに触って全然使い方を忘れていたので、改めて初心者に戻り修行したいと思います。

今回行うこと

・ボタン実装までの手順(UI image)
・ランダム生成、乱数
・絶対指定、相対指定の仕方

*ボタン実装までの手順(UI image)

意外と時間を使ったのでできるだけ細かく記載していこうと思います。

手順1

Hierarchy→Create → Image を選択
f:id:geta206:20170911093626j:plain

手順2

1. Create→Create Emptyを選択
するとGameObjectが出現
f:id:geta206:20170911093949j:plain
2. Inspectorを選択し、Add Componentをクリック
   New Script →C#を選択。
f:id:geta206:20170911094302j:plain
上記のように表示されると思います。


手順3

Assets→C#のファイルをクリックし、コードを記載する。
void Start()の{}の中に以下を記載します。

using UnityEngine.UI;

public class hogehoge : MonoBehaviour {

	// Use this for initialization

	void Start () {
	  // 対象を探す
          var botan = GameObject.Find ("hogebtn").GetComponent<Button> ();
	  botan.onClick.AddListener (delegate {
	   Debug.Log ("押してやったぞ");
	});
        }
	
	// Update is called once per frame
	void Update () {
	}
}
手順4

Canvas → Image をクリックし Inspector→Add Component →Scripts→C#のファイルを選択。
Imageの名前をC#で記載した名前に変更。Enterをクリック。

f:id:geta206:20170911095923j:plain

手順5

Add Component → UI → Button追加
f:id:geta206:20170911101346j:plain
実行!

ランダム生成/ 乱数

Start(){}の中に記載。

                 //整数型の変数を定義
			int a = 12;
			int b = 23;
			//足し算してみた
			Debug.Log (a + b);
			//aの値を書き換えてみた
			a = 6;
			Debug.Log (a);
			a = a / 2;
			Debug.Log (a);

			//論理計算
			if (a < b) {
				Debug.Log ("aよりbが大きい");
			}
			if (a == b) {
				Debug.Log ("aとbは同じ");
			} else if (a > b) {
				Debug.Log ("aはbよりも大きい");
			} else {
				Debug.Log ("それ以外");
			}

			//ランダム
			//aの値を書き換えてみた
			a = Random.Range (1, 7);
			//※整数1から6のどれかになる
			//論理計算 if とelseを組み合わせて
			if (a < 3) {
				Debug.Log ("右ストレート");
			} else if (a < 5) {
				Debug.Log ("中央突破");
			} else {
				Debug.Log ("左に発射");
			}

絶対指定・相対指定

       void Start () {
		// 対象を探す
		var botan = GameObject.Find ("hogebtn").GetComponent<Button>();
		    botan.onClick.AddListener (delegate {
		//ボタンの移動(絶対指定のみ)
			// 座標の変数を定義
			Vector2 pos = new Vector2 (320, 320);
			//対象を探し当てる
			GameObject aaa = GameObject.Find("Canvas");

			//移動
			aaa.transform.position = pos; 

		});
	}
	
	//クリック(画面タップ位置に移動)
			void Update (){ 
				if(Input.GetMouseButtonDown (0)) { 

		


			       //対象を探し当てる(相対・絶対指定)	
 			       var moveObj = GameObject.Find ("btn0"); 
				   //Debug.Log (moveObj.transform.position); 
				moveObj.transform.position = Input.mousePosition;

			//移動量x,y,zを指定して移動!(相対指定)
			//moveObj.transform.Translate(20,50,0);
				}
			}
解説・補足

Start{}は一回のみ実行される。
Update{}は何度でも実行される。

varという大きなくくりの中にGameObjectがある。

Findで対象を探してから命令を実行する。(探す→CRAD処理の形)

   var moveObj = GameObject.Find ("btn0");

スマホアプリ入門書を読んだ。(Unity)

今働いている会社がUnityの開発現場で、入門書を読む機会があったのでメモ。

覚えるべきこと

・リファレンスを読むべし
 
docs.unity3d.com

検索方法・質問方法

質問NGワード

【一度にすべてをやろうとする】
目的の動作を一度に達成しようとするのは、問題をあえて難しくするようなものです。課題はステップに分けて、ひとつひとつ解決していきましょう。それが、目的を達成する早道です。
テニスを習い始めたら、試合で勝ちたい、あるいはいいプレーをしたいと考えるのは当然です。ただ、だからといって、いきなり試合をこなして上達しようとするのは無茶です。サーブやレシープ、ボレーといった基本をひとつずつ練習し、場合によっては基礎体力も鍛えて、それから試合に臨むのが結果として上達の早道になります。

【具体的なスクリプトを教えてください】
その前に、具体的な処理の流れや考え方は理解されましたか? アクセル・ブレーキ・クラッチの機能を「理解」せず、単に操作の順番だけ「丸覚え」してたまたま車が走ったとしても、それは自動車を運転できたことにはなりません。それどころか、危険でさえあります。

【~してしまいます。どうしたらよいでしょう】
たとえば「道に迷ってしまいました。どうしたらよいでしょう?」と尋ねられても、答えようがありません。最低限どこに行きたいのかという目的地を伝え、現状はどうなっているのか具体的な説明が必要です。単に困っているという悩みを相談したいのでしたら、占い師か精神科医を訪ねるべきです。
もしかすると、たまたま同じ現象(エラー)に遭遇して、しかも原因をつきとめ、それが偶然にも自分と同じで、さらに幸運なことに解決策まで見いだした人に出逢えることを期待しているのかもしれません。しかし、それは「白馬の王子様」を夢見る少女と同じ幻想です。

【うまく説明できません】
「うまく」説明できなくて、結構です。ただ、へたでも何でも、説明はしてもらわないことには、話が先に進みません。
言葉の通じない旅先で、親御さんか恋人あるいはお子さんが原因不明の急病になったとしましょう。お医者さんに説明しようにも、言葉がわかりません。そんなとき、「うまく説明できません」といったきり、放っておきますか?辞書を調べ、身振り手振りを交え、絵を描いて見せたり、自分にできるあらゆる手段を使って、状況を詳しく正確に伝えようとするのではありませんか?

スクリプトはわからないので】
スクリプトを書こうとして、質問されているのではないのですか? でしたら、わからないでは済まされません。
回答者に希望のスクリプトを作成してもらって、そのまま使いたいということでしたら、それは「質問」とはいいません。「作成依頼」もしくは「発注」です。それなら、ご予算も伝えるべきでしょう。もちろん、それを0円とされるのも自由です。ただ、ご自分が生業とされている仕事を、見ず知らずの他人にタダでやってくれといわれたとき、どう感じるかは想像してみる価値があります。

スクリプトを見てください】
実際のスクリプトを見せるのは結構です。しかし、問題部分の切分けさえしていないスクリプトを、何の説明もなく羅列するのはやめましょう。正しく動作しないスクリプトというのは、チューニングの合っていない楽器のようなものです。そのまま何もいわず、全曲フルに聴かせるのは、嫌がらせでしかありません。
「ローマの一番よい三流のホテル」。これは、あるイタリアのホテルのホームページ上に、実際に記載されていた文です。もちろん、誤訳です。正しい日本語に直してくださいと頼まれたら、何と答えますか?「いったい何がいいたいの?」と聞返すのではないでしょうか。間違った日本語だけ見せられても、本当は何を伝えたいのかという意図がわからなければ直しようはないのです(なお、原文は"superior 3-star hotels in Rome"のようで、「三流」ではなく「三つ星」とすべきでした)。

【第三者から見てわからない】
119番に「隣の家が火事です!!」と叫んでも、当然のことながら消防車は出動できません。「隣の家」はあなたにとって明らかなのでしょうが、あなたがどこにお住まいなのかわからないからです。
「読込んだ画像がちゃんとした大きさで表示されません」などというご質問も同じです。ちゃんとした」大きさというのはどういう状態で、どうなると「ちゃんと」していないのでしょう。もとのファイルの大きさが、変わってしまうといいたいのかもしれません。しかし、何かサイズ変更の処理をしたのであれば、もとのままの大きさであれば逆に問題です。つまりどうしたいのかという意図がわからなければ、表示されている画像を見ても、「ちゃんと」しているのかいないのか判断できないのです。
ご質問は、複数の第三者が文面を見て、そのポイントにおいてほぼ同じイメージを想い浮かべることができるように客観的にご説明ください。そして、問題や希望とする動作のご説明は、第三者がその内容を手元で再現できる程度に、具体的にお書きいただく必要があります。

【問題を切分けない】
診察で「今日はどうしました?」と訊かれて、「実はうちの嫁が...」と愚痴をこぼし始めるお年寄りの笑い話があります。お嫁さんの話は、診察には関係がありません。では、「足を挫いてしまって」だったら? そこが内科の診察室でしたら、やはり場違いということになります。
ムービーを実際に作成するには、さまざまな作業があります。しかし、質問されるときには、その問題に関連する部分を切分けて説明しましょう。
よくある例が、「外部テキストを読込んで~したところ」から延々と説明を始められる、診察室のお年寄りに近いパターンです。「外部テキストから読込まずに、直接テキストを設定すると問題は発生しませんか?」と訊かれて、もし答えが「発生する」でしたら、外部テキストの読み込みは問題と直接「関係」のない話です。
あるいは、胃の検査をする際には、空腹にしてくるよう指示されるはずです。胃に余分なものが入っていたら、胃の状態を正しく知ることができないからです。
胃が満腹のままどこが悪いのか調べるのは、名医でも困難で、無謀といえます。また食事も抜かず、胃に余分なものが入った状態で、どこが悪いのか教えてくれとオーダーするのは、傲慢な態度と思われても仕方ないでしょう。

【問題を絞込まない】
道に迷ったとき、やみくもに歩き回るのは危険です。まずすべきことは、立ち止まり地図を開いて、今自分がどこにいるのか見当をつけることです。事件が発生したら、犯行時刻を推定します。そして、その時刻をもとに、容疑者を絞込みます。同じように、問題が起こったとき、それがどこからどこまでの処理の間で発生しているのかを絞込む作業が大切です。その絞込みをせずむやみに検索したり試したりするのは、犯行時刻を特定せずにキャッチセールスのような聴込みをするのに等しいです。
どうしても見当がつかない場合には、ムービー中の要素(Flashなら、フレーム・シンボル・インスタンス。あるいは、スクリプトステートメントや式の項)を片っ端から削除していきます。その都度動作を確認して、問題の現象が消滅したら、その直前に削除した要素の中に容疑者がいます。そうして、これ以上ひとつの要素も削除できないという状態になったら、改めてその内容を詳しく確認しましょう。おそらく、この時点でおおよその目星はついてくるはずです。

【問題を単純化(シンプルに)しない】
お手玉を初めて覚えようとするとき、まずふたつか3つで始めるでしょう。いきなり10個でやれといわれたら、ほとんどの人は無理だと答えるはずです。ところが、複雑な処理が意図どおりの結果にならないとき、処理を複雑にしたまま頭を抱える人が少なくありません。
10個のお手玉を目標にするにしても、いきなり10個を投げたのでは、到底できるはずがありません。まずふたつか3つで練習して、それができたら徐々に数を増やしていくというのが賢明です。処理内容も、いくつかのステップに分けたり、あるいは本質を変えない範囲で単純化したり、1回に取組む規模をできるかぎり小さくする工夫が必要です。

【よくわかりません】
これは、お医者さんの診察室で「どうしました?」と尋ねられて、「具合が悪いのです」と答えるようなものです。確かに、そのとおりでしょう。でも、お医者さんには、基本的に具合の悪い人しかきません。「具合が悪い」というのは、何も情報を伝えたことにならないのです。
必要なのは、どこまでならわかったのか、そしてどこからわからないのかという、具体的なご説明です。「よくわかりません」という答えが適切と考えられる例は、警察で取調中の容疑者と、国会で証人喚問を受けている政治家くらいでしょう。つまり、何も答えたくない場合に、使うことばです。

Railsの会26日目[ /authenticate/minimum / !!]

今回の範囲
f:id:geta206:20170624095221p:plain

パスワード設定

6文字分のスペースでパスワードを設定した場合falseで返すテスト

  test "password should be present (nonblank)" do
    @user.password = @user.password_confirmation = " " * 6
    assert_not @user.valid?
  end

最低5文字以内か調べる

  test "password should have a minimum length" do
    @user.password = @user.password_confirmation = "a" * 5
    assert_not @user.valid?
  end

minimum

カラムの最小値を求める。

User.minimum('age')
# SELECT MIN("users"."age") AS min_id FROM "users"

minimum - リファレンス - - Railsドキュメント

!!

論理オブジェクトに変換。
trueかfalseで返すようにする。

!!user.authenticate("foobar")
=> true

authenticate

認証に失敗した時にfalseを返す。
( !!がついている場合結果が反対になる)

間違えているpasswordを与えてみる

[14] pry(main)> user.authenticate("not_the_right_password")
=> false

正しい値を与えてみる

[15] pry(main)> user.authenticate("password")
=> #<User:0x007fcb694285b0
 id: 1,
 name: "hoge",
 email: "h@h.com",
 created_at: Tue, 20 Jun 2017 16:09:49 UTC +00:00,
 updated_at: Tue, 20 Jun 2017 16:09:49 UTC +00:00,
 password_digest: "$2a$10$Hl8/iF2bbu7D37z3aeh5T.OMNdhRR0flsFhflsfF3L/E041sO">

Rubyの否定演算子2つ重ね「!!」(double-bang)でtrue/falseを返す

6 章のまとめ

マイグレーションを使うことで、アプリケーションのデータモデルを修正することができる
・Active Recordを使うと、データモデルを作成したり操作したりするための多数のメソッドが使えるようになる
・Active Recordのバリデーションを使うと、モデルに対して制限を追加することができる
・よくあるバリデーションには、存在性・長さ・フォーマットなどがある
正規表現は謎めいて見えるが非常に強力である
・データベースにインデックスを追加することで検索効率が向上する。また、データベースレベルでの一意性を保証するためにも使われる。
・has_secure_passwordメソッドを使うことで、モデルに対してセキュアなパスワードを追加することができる