unity AIのターゲットを途中で変更

動的に変更できる

時間がないのでスクリプト全文

using UnityEngine;
using System.Collections;
//using UnityStandardAssets.Characters.ThirdPerson;

public class targetchange : MonoBehaviour {
	public NavMeshAgent myObj;
	public Transform goalpos1;
	public Transform goalpos2;
	public Transform dummy;//AIThirdPersonを入れる
	Transform setPos;

	void Start(){
		setPos =  dummy;
	}

	void Update(){
		
		myObj.SetDestination (setPos.position);
	}

	//スピードを0.5に変える
	public void chngSpeed(){
		myObj.speed = 0.5f;
	}


	//ターゲットをgoalpos1にする
	public void target1(){
		setPos = goalpos1;

	}

	//ターゲットをgoalpos2にする
	public void target2(){
		setPos = goalpos2;
	}
}

参考動画(ボタンで切り替えています)

AI機能を用いたゲームの制作(1)

今回はAI(人工知能)を利用したゲームを制作する
この場合のAIとは流行のDeep Learning(深層学習)ではなく,最短距離を検索する経路探索アルゴリズムである
UnityではNavigation SystemでA*というアルゴリズムを利用してこれを実現している
https://docs.unity3d.com/jp/current/Manual/nav-InnerWorkings.html

1)Navigationの使い方

  1. File>New Scene で新規シーンを作成
  2. GameObject>3D Object>Plane で平面を作成
  3. InspectorでScaleを全て10倍にする
  4. Project内の StandardAssets>Characters>Prefabs から,(A)ThirdPersonControllerと(B)AIThirdPersonControllerをPlane上に配置する
  5. (B)AIThirdPersonCharacotrを選択し,InspectorにあるAI Character Control内Targetに,ヒエラルキーの(A)ThirdPersonCharacotrをアサインする
  6. メニューバー>Window>Navigationを選択
  7. 設置したPlaneを選択し(下図1),Navigationの設定からObjectを選択(下図2)し,Navigation Staticにチェックをれ(下図3),Navigation AreaからWalkableを選択(下図4)
  8. 右下のBakeをクリック(上図の5)し,歩行可能エリアを焼き付ける
  9. ゲームを再生してみる
  10. やたら速く追いかけられる
  11. そこで(B)AIThirdPersonControllerのInspectorにあるNav Mesh AgentSpeed(初期値は1)を変える.これで追いかけられるスピードを変更することができる

NPC(Non Player Character)を動かす一つの方法として,こうしたアルゴリズムが利用されている

 

2)歩行不可エリアの設定

  1. 次に,障害物を設置し,歩行不可エリアを設定する
  2. StandardAssets内ProtoType内のPrefabを適当に配置する(Projectに無い場合は,Assets>ImportPackages>Prototypingで読み込む)
  3. Prefabs内のモデルをPlane上に配置する.自由な位置に置いてかまわない
  4. 置いたPrefabを選択し,Navigation Staticにチェックを入れ,Navigation AreaからNot Walkableを選択
  5. 右下のBakeをクリックし,歩行不可能エリアを焼き付ける
  6. ゲームを再生する

追いかけるスピードを変化させることで,例えばゾンビが,撃たれたきっかけでスピードを落としたり,距離で判定しギリギリで追いつかないといった設定もできる

これらを利用して可能なのが

・鬼ごっこ

・障害物競走

・だるまさんがころんだVR(需要あるのか?)

などではないか.

3)ゲームを企画する

これまでのテクニックを用いて,AIを用いたゲームを企画し,実際に制作せよ.地形(Terrain)またはPlane上でプレイし,制限時間を設けること.

なんらかの勝ち,負けを判定し,結果を変えること

スクリプトはEdukit内の物を使ってかまわない(改造してもかまわない)

機能ではなく世界観やその世界が持つ独自のルールに注力すること

NCMB パスワードリセット

UnityでのNCMBパスワードリセットの方法(全文)

時間ないので全文転載

using UnityEngine;
using System.Collections;
using NCMB;
using UnityEngine.UI;//use unity gui
using UnityEngine.SceneManagement;

public class PassReset : MonoBehaviour {

	public Text emailfield;
	public Text statustxt;
	string meado;
	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}



	public void doResetvoid(){
		meado = emailfield.text;
		//NCMBUser user = new NCMBUser();
		NCMBUser.RequestPasswordResetAsync(meado,(NCMBException e) => {    
			if (e != null) {
				UnityEngine.Debug.Log ("ログインに失敗: " + e.ErrorMessage);
				statustxt.text = "リセットに失敗しました\nメールアドレスを確認してください";
			} else {
				statustxt.text = "パスワードリセットに成功しました\nメールを受信しパスワードを再設定してください";

				Invoke("toTop", 3f);
			}
		});

	}


	//scne change
	public void toTop(){
		SceneManager.LoadScene ("top");
	}

}

メールに仮パスワードとリセットページへのリンクが届くのでWEBでリセットするらしい

NCMBのユーザIDをplayerPrefsに入れて呼び出す

NCMBのuser.objectIdを取得して,他のところで使います

//JSON読み込み
				foreach (NCMBUser users in userList) {
					suDicAll.Add(users.UserName.ToString(), users.ObjectId.ToString());//Dictionaryに入れる

				//ここでJSON化し,PlayerPrefesに入れる
					myjson = Json.Serialize(suDicAll);

				}//foreachここまで
PlayerPrefs.SetString("sulist", myjson);


//JSON読み出し
using MiniJSON;//use miniJSONが必要です

			string mytest  = PlayerPrefs.GetString ("sulist");
			var sudic = Json.Deserialize(mytest) as Dictionary<string, object>;


			foreach (KeyValuePair<string , object> pair in sudic) {
				Debug.Log (pair.Key + ":" + pair.Value);
				acl.SetReadAccess(pair.Value.ToString(), true);//加算用のテンポラリ変数
			}

 

Unityで日付

日付1日足して表示

 

	DateTime dt;
	public Text niti1;
	public Text niti2;
	// Use this for initialization
	void Start () {

		//今日の日付を取得
		dt = System.DateTime.Now;

		niti1.text  = System.DateTime.Now.Month.ToString() + "月" + System.DateTime.Now.Day.ToString () + "日";

		TimeSpan ts = new TimeSpan(1, 00, 00, 00);
		dt = dt + ts;
		niti2.text  = System.DateTime.Now.Month.ToString() + "月" + System.DateTime.Now.Day.ToString () + "日";
}

 

NCMBでprefab生成

プレファブ生成

 

//変数設定
	public RectTransform nodePrefab;
	public RectTransform content;

////以下スクリプト本体	

int mymax2 = 6;//forの回数
		for(int p = 0; p < mymax2; p++){
			var item = GameObject.Instantiate(nodePrefab) as RectTransform;  //プレファブを生成してitemに入れる
			item.SetParent(content, false);//それをcontenteの子にする(上で変数宣言している)
			GameObject labelobj = item.transform.Find("Label").gameObject;//その中からLabelというオブジェクトを検索する
			var idtextcompo = labelobj.GetComponent<Text> ();//Labelのはいったオブジェクトの中のテキストコンポーネントを取得
			idtextcompo.text = "test";//その文字列を設定

		}

 

NCMBで日付

必要なライブラリ

using NCMB; //use Nifty Cloub Mobile Backend
using System;

 

日付用の変数

//変数
 DateTime mydate;
		public Text nyuYear;//入所日年

		public Text nyuMon;//入所日月

		public Text nyuDay;//入所日日

//


string myString = nyuYear.text + "/" + nyuMon.text + "/" + nyuDay.text;
DateTime mydate = DateTime.Parse(myString);

NCMBObject obj = new NCMBObject ("myobj");//NCMBobjectのクラス名

			obj.Add("hiduke", mydate);//hidukeフィールド名にmydateを追加

			obj.SaveAsync ((NCMBException e) => {      
				if (e != null) {
					//エラー処理
				} else {
					//成功時の処理

					Debug.Log("good");//送信成功の意味

				}                   
			});

 

 

NCMBでオブジェクトのACLを変更

NCMBのユーザでなくオブジェクトのACLを変更する手順

動作したスクリプトを抜粋してるので動作確認無しです

NCMBUser user;
	string acltest;
	// Use this for initialization
	void Start () {
		user = NCMBUser.CurrentUser;
		string userName = user.UserName;

		//UserTypeフィールドにsuperの入っているユーザを検索してListに入れる
		NCMBQuery<NCMBUser> query = NCMBUser.GetQuery ();
		query.WhereEqualTo ("userType", "super");
		query.FindAsync ((List<NCMBUser> userList , NCMBException e) => {
			if (e != null) {
				UnityEngine.Debug.Log ("失敗 : " + e.Message);
			} else {
				foreach (NCMBUser users in userList) {
					pairUsers.Add(users.UserName.ToString());//SUの名前をリストに入れる
				}//foreachここまで
				acltest = userList[0].ObjectId.ToString();
			}
		});
		getuserlist();

	}


	void getuserlist(){
		string userName = user.UserName;
		NCMBQuery<NCMBObject> query2 = new NCMBQuery<NCMBObject> ("testobj");
		query2.WhereEqualTo ("player", userName);//Playerがusernameの結果を検索
		query2.FindAsync ((List<NCMBObject> objList ,NCMBException e) => {
			if (e != null) {
				//検索失敗時の処理
				Debug.Log("e");
				return;
			} else {
				if ( objList == null || objList.Count == 0 ){
					Debug.Log("e");
					return;
				}
				Debug.Log(objList.Count);
				int po = 0;

				foreach (NCMBObject objdata in objList) {//ne
					var acl = objdata.ACL;//ACL書き換え準備
					//読み込み権限全close
					acl.PublicReadAccess = false;
					//書き込み権限を全close
					acl.PublicWriteAccess = false;

					//userNameきっかけで読み書きアクセスお追加する
					acl.SetWriteAccess (user.ObjectId.ToString(), true);
					acl.SetReadAccess (user.ObjectId.ToString(), true);

					//他の方へのアクセス許可用
					acl.SetReadAccess (acltest, true);

					objdata.ACL = acl;//保存準備
					objdata.SaveAsync ((NCMBException z) => {      
						if (z != null) {
							//エラー処理

						} else {
							//成功時の処理
							Debug.Log(acltest);
							//objdata.ACL = acl;
							Debug.Log("good");//送信成功の意味

						}                   
					});
				}//for eachここまで

			}
		});
}

 

NCMBでパスワード変更はできない

できないらしい

また、ニフティクラウド mobile backend では、パスワード変更のAPIは用意していないため、パスワードを変更したい場合にはパスワードのリセットの処理が必要となります。

なので,RequestResetPassword()らしい(Unityで使えるかはしらん)

SDKガイド (JavaScript) : 会員管理 | ニフティクラウド mobile backend

ニフティクラウド mobile backendのJavaScript SDKでアプリの会員管理を行う方法について解説します。

LINK: mb.cloud.nifty.com/doc/current/sdkguide/javascript/user.html