「C#」カテゴリーアーカイブ

Unity GUI(4)ランダム値の確認

こんどは,さきほどの

		int cat = Random .Range(0, 2);
		Debug.Log (cat);

void Update(){   }

の間に移動させ(void Start(){  }の間から出して),再生してConsoleを確認しましょう.

4

こうなります.

Update中の{}に書かれたものは,ゲーム再生中ひたすら繰り返されます.

 

UNITY GUI(3) 空のオブジェクトを作成する

それでは,Unityに戻り

メニューバーの Gameobject>Create Empty を選択します

HierarchyにGameObjectが作成されます.これを分かりやすい名前に変えてもいいですが,面倒なので,そのままでいいです.

先ほど作ったmyscriptをこの作成されたGameObjectの上へドラッグ&ドロップします

このスクリプトがGameObjectへアサインされました.

再生ボタンをクリックします.

コンソールを確認すると,そこには0か1が表示されています.3

 

Unity GUI(2)ランダム値

ランダム値を発生させてみましょう

	// Use this for initialization
	void Start () {
	}

このvoid Start()に囲まれた中を最初の1回実行します.最初の1回のタイミングは,UnityのPlayボタンを押した時の1回です.

この と  の間に

		int cat = Random .Range(0, 2);
		Debug.Log (cat);

と入れてください.

int整数の変数を作ろう!(えさ箱)

cat は整数をいれておくための変数の名前(えさ箱の名前的な)

Radndom乱数発生

.Ramge範囲指定

(0, 2)範囲は0から2の間

の意味です.

Debug.Log(cat); はcatの変数の中身をコンソールに表示せよというものです.

これを記入して,保存します.

 

Unity GUI(1)準備

Unityのボタンやアイコンなど,GUIと呼ばれるパーツを作成してみましょう

なお,検索語は ugui (unity guiの意味)がいいです.

以前あったアセットに,NGUIというものがあり,それと混同されることがたまにあるので注意ください.

 

  1. Unityを起動します
  2. Asstesウィンドウ上で右クリックして create > c# script を選ぶ1
  3. ファイル名を変えられる状態になるので2myscript と入力
  4. もしも名前を変更前に確定してしまった場合は,後で修正します
  5. 作成したスクリプトをダブルクリックして開く.コードエディタが開きます.
  6. 最初の2行の
using UnityEngine;
using System.Collections;

後に

using UnityEngine.UI;

を追加します.

これはUIシステムを使えるようにするためです.UIを使わない場合は不要です.

冒頭の3行はこうなりましたか?

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

 

Unity入門-15

条件分岐に応じてリザルトを変更する

 

復習

  • シーン遷移のスクリプトはどこ?
  • シーン遷移するためには,build setupにシーンを入れておく
  • invokeは「ちょいまち」のこと

条件分岐

  • 経由地を全て取得=endシーンへ(現在の設定)
  • タイムアップ=新たに作成するタイムアップシーンへ

概要

  1. endを複製し名前と画像を変更
  2. タイムアップをしたら,タイムアップシーンへと飛ばす
  3. 実行して確認

編集する

badendシーンを作成する
  1. edukit内のend選択
  2. Edit>Duplicate で複製する
    enddup
  3. ファイル名がend 1になるので,名前を badend に変更
    badend
画像を入れ替える
  1. badendをダブルクリックして開く
  2. Hiearchy>Canvas>Imageを選択する
    canvas
  3. インスペクタのSource Imageで画像を「ざんねんでした」と表示されている画像(ui_1)にする
    imageswap
  4. リザルトは不要なので,Hierarchy>Canvas>timemat を選択し,右クリック>Delete で削除する
    timedelete
ビルドシーンに加える
  1. このシーンをビルドする対象に含める(でないとシーン遷移できない)
  2. (下図の1)File>Build Settings… を開く
  3. (下図の2)Add Open Sceneをクリックする
  4. (下図の3)badendが追加されたか確認して閉じるbuildscn
スクリプトを変更する1
  1. edukit>myQuest をエディタで開く
  2. 以下のスクリプトを追加する.どこに追加するとよいか?(これは滑り台のように1回実行されるもの)
	void gobadEnd(){
		SceneManager.LoadScene ("badend");//go badend scene
	}
スクリプトを変更する2
  • 同じくmyQuestを開き,タイムアップした箇所で上記の関数を実行するにはどうすればよいか?(ヒントは上の復習コーナーに)
その他
  • 自習用のサンプルなどを例示する

Dictionaryの使い方(MBAAS関連)

MBAASはJSON互換だけど,JSONは遅れずDictionaryが受けられるらしい.

んで,Dictionaryを真面目に使ったらエラーでるのよ.

 

いける例

using System.Collections.Generic;

public class skillSender : MonoBehaviour {
	
		 static public Dictionary<string,int> skillPDic;//スキルチェックポイント用


	// Use this for initialization
	void Start () {

			skillPDic = new Dictionary<string, int> () {
				};

	}

NGの例

using System.Collections.Generic;

public class skillSender : MonoBehaviour {
	
		 static public Dictionary<string,int> skillPDic;//スキルチェックポイント用


	// Use this for initialization
	void Start () {

			Dictionary<string,int> skillPDic = new Dictionary<string, int> () {
				};

	}

 

 

 

Unity入門-14

 

0秒になったら終了させる

  • まずは時間がゼロ秒になったら終わらせるプログラムを入れる場所を探す
  • 探し方概要
    • 概要:いろいろな場所にDebug.Log(“koko”);を書いて,1秒毎に変化する場所を探す
    • 入力した行が実行された時にコンソールkokoと表示される
    • コンソールのCollapseはオフにする(Collapse同じ内容は1行だけ表示する機能をオフにする)
  • 実際の探し方
    • 各関数{}内の最初か終わり近くにDebug.Log(“koko”);を記入
    • 保存→ゲーム実行→Consoleを確認 を繰り返し,秒変化と同じタイミングで現れる箇所を探す
    • ヒント:秒の変化と音(Tick)の再生は同期しているので,そのあたり,,,?
  • その場所に以下のプログラムを入力する
			if (gameTime < 1) {
				//go end
				StopCoroutine("loop");
				Invoke("goEnd", 2f);
			}

変数 gameTimeが1未満になったら,時間制御をしているコルーチンloopを止めて,goEndの関数を2秒後に実行 の意味

こちらは2秒後に実行されるので,少し余裕が持てます.goEndを実行するタイミング(ここでは2秒)を変えて自分が最も良いと思う時間に変更してみましょう

なお2fのfはfloat(実数)の意味です.Unity上では実数の場合はfとつけるルールがあります

 

これでもいけます

if (gameTime < 1) {
goEnd();
			}

変数gameTimegが1未満になったらgoEnd関数を実行(こっちは2秒待たないのでせわしない)

 

シーンチェンジはどこ?

  • シーン「end」にジャンプする関数 void ○○○(){   } はどこか再度確認すること(上でに書いてありますが)

変数宣言をいろいろ試す

  • 変数宣言をする場所がある
    • グローバル編
      • プログラムのどこでも使えるけど,このプログラム外では使えない
      • publicをつけるとインスペクタで設定できる.インスペクタで設定した値は,プログラムで宣言した値よりも優先される(プログラム側で変更はできる)
      • privateをつけるか何もつけない変数宣言はインスペクタには表示されない
    • ローカル編
      • 関数内で使える(ちょいとメモ代わりや,変数の受け口に使える)
    • 神編
      • staticは神
      • public static int mikeneko; と宣言すると,スクリプト名.mikeneko でゲーム内のどこでも使える
      • ただし関数などによってはstaticを嫌うものがあるので,その際はnamespaceなどを使ってusingする

NCMBでデータストア管理

96時間はまったこと

  • NCMBデータストアはJSON互換だけどJSONは保存できない
  • NCMBデータストア一回のセッションに複数のログ(今回はスキルチェックの結果)を保存する場合は,Dictionaryで保存する
  • UnityのC#でDictionaryを使うには最初に「using System.Collections.Generic;」って言っておく
  • アクセス権を設定する場合,新規オブジェクトの場合は「NCMBACL acl = new NCMBACL ();」でいいが,既存の場合は一旦アクセス権を読み込んでから書き換える(参考サイト
  • データストアはACL設定しないと公開になる仕様らしい(ランキングとか用なので)
  • ACLのスクリプトでユーザ名の使い方その1
    NCMBUser user = NCMBUser.CurrentUser;
    string userName = user.UserName;
    			NCMBACL acl = new NCMBACL ();//今回のログは新規作成なのでnewでよい
    			acl.SetWriteAccess (userName, true);
    			acl.SetReadAccess (userName, true);

     

 

Unity入門-13 スクリプトmyQuestをざっくり対訳してみる

対訳してみました.

元のスクリプトは

using UnityEngine;
using System.Collections;
using UnityEngine.UI;//UIを使用するのに必要
using UnityEngine.SceneManagement;//シーン遷移をするのに必要

public class myQuest : MonoBehaviour {

	[SerializeField, HeaderAttribute ("経由地の数")]
	public int points;

	//sound
	[SerializeField, HeaderAttribute ("効果音をドロップ")]
	public AudioClip getSound;
	public AudioClip tickSE;


	//default time
	[SerializeField, HeaderAttribute ("カウントダウンの初期時間")]
	public int gameTime;
	[SerializeField, HeaderAttribute ("残時間のUItextをドロップ")]
	public Text timeText;
	[SerializeField, HeaderAttribute ("残りの経由地数表示UIをドロップ")]
	public Text nokoriText;

	[SerializeField, HeaderAttribute ("エンディングのシーン名を入力")]
	public string endSceneName;

	//audio source get from this script attached
	AudioSource myaudio;


	// Use this for initialization
	void Start () {

		myaudio =	GetComponent<AudioSource>();
		timeText.text = "残り時間" + gameTime.ToString () + "秒";
		nokoriText.text = "のこり" + points.ToString () + "個";
		//start after nSec
		Invoke("timeCount", 3.5f);
	}
		
	void Update () {
	
	}


	//if hit destroy obj
	void RedirectedOnTriggerEnter(Collider mycollider) {
		//Debug.Log (mycollider.gameObject.tag);
		if (mycollider.gameObject.tag == "pointObj") {
			points--;
			nokoriText.text = "のこり" + points.ToString () + "個";
			myaudio.PlayOneShot (getSound, 0.7F);
			Destroy (mycollider.gameObject);

			if (points < 1) {
				//go end
				StopCoroutine("loop");
				Invoke("goEnd", 2f);
			}
		}
	}

	void timeCount(){
		StartCoroutine("loop");
	}

 

対訳はこちら(画像:クリックで拡大)

%e5%af%be%e8%a8%b3%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86

次へ

game managerシステムみたいなの

 

よくつかう関数をいれとくのを作ります

using UnityEngine;
using System.Collections;

namespace globalManager{//名前空間

public class myManager : MonoBehaviour {//クラス名はmyManager


		public static void mytest2(){
			Debug.Log ("test");
		}

		public static void mytest3(int cat){
			Debug.Log (cat);
		}


}

}

 

このnamespaseでusingすると呼び出せます

using UnityEngine;
using System.Collections;
using globalManager;//必要

public class slaveScript : MonoBehaviour {

	void Start () {
		myManager.mytest2 ();
		myManager.mytest3 (5);
	}
	

}

これで,コンソールには

「test」「5」と表示されます