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

ドアが左右に回転して開くをむりやりc# で

コライダのオブジェクトにアサインする

 

スクリプト

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

public class door : MonoBehaviour {


	public Transform _RdoorRoot;//右ドアのルート入れる
	public  Transform _LdoorRoot;//左ドアのルート入れる
	bool doorCheckBool = false;//ブーリアン
	float stTime;//コライダにヒット開始時間

	public Transform from;//元の角度
	public Transform to;//90度の角度を入れたnullをアサイン
	public Transform _to;//−90度の角度を入れたnullをアサイン
	public float speed;//回転速度

	void Update () {
		if (doorCheckBool) {
			_RdoorRoot.rotation = Quaternion.Slerp (from.rotation, to.rotation, (Time.time - stTime) * speed);
			_LdoorRoot.rotation = Quaternion.Slerp (from.rotation, _to.rotation,  (Time.time - stTime) * speed);
		}
	}
		
	void OnTriggerEnter(Collider other) {//コライダ入ったら
		doorCheckBool = true;//ブールをtrueにするとUpdateで作動する
		stTime = Time.time;//現在の時間を記録しておく
		GetComponent<BoxCollider>().enabled = false;//1回作動させたらコライダーをオフにして使用できなくする
	}
		
}

 

配置方法

実行結果

ドラッグして位置決め

このスクリプトは自由座標に移動する

実際には決まったMatrixにスナップするように,数値を丸めたほうが扱いやすい

その際に下のPlaneにグリッドを表示させ,そのグリッドを光らせるなどの対処が必要かど

スクリプト

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

public class dragPoint : MonoBehaviour {
	RaycastHit hit;
	Ray ray;
	Vector3 currentPos;//最終位置保存用変数


	void OnMouseDown(){ //マウスクリック開始時用
		currentPos = this.transform.position;//上昇前の値を入れる
		this.transform.position = currentPos + new Vector3 (0f, 1f, 0f);//Y軸に1だけ上昇させる
		currentPos = this.transform.position;//上昇した値を入れる
	}

	void OnMouseDrag(){//マウスドラッグ時

		ray = Camera.main.ScreenPointToRay(Input.mousePosition);//マウスクリックポジションをrayで取得する
		if (Physics.Raycast(ray, out hit, 100f)){//rayが当たった位置をhitに入れる
			this.transform.position = new Vector3 (hit.point.x, currentPos.y, hit.point.z);//XとZ座標だけをhitの座標にする
			currentPos = this.transform.position;//最終位置を変数に入れておく
		}  

	}

	void OnMouseUp(){//マウスクリック終了時
		this.transform.position = currentPos - new Vector3 (0f, 1f, 0f);//最終位置からY軸に1だけ下降させる
	}
}

追記

21行目を

this.transform.position = new Vector3 (Mathf.Floor(hit.point.x), currentPos.y, Mathf.Floor(hit.point.z));//

のようにMathf.Floorで小数点以下を丸め(切り捨て)ると,1m単位で動きます

 

実行結果

UnityにJSONで複雑な情報記録2

Dictionaryの中にListを入れることで解決をはかってみる実験

 

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

using System.Collections.Generic;//必ず必要

public class dicPractice : MonoBehaviour {

	public GameObject ballPre;//ボールプレファブ用
	public InputField numInput;//インプットフィールド用

	Dictionary<int, List<string>> timeList1;//多重化
	List<string> tempList ;//テンポラリ用のList

	void Start () {
		//Dictionary,Listの追加
		timeList1 = new Dictionary<int, List<string>> ();
		tempList = new List<string>();

		//json用オブジェクトを作成
		myData jdata = new myData();

		//キャラ10体作成
		for (int i = 0; i < 10; i++) {
			
			GameObject go = Instantiate (ballPre, new Vector3 (i * 2.0f, 0, 0), Quaternion.identity) as GameObject;
			string myAIname =  "AI" + i.ToString ();
			go.name = myAIname;

			//json化準備
			jdata.id = i;
			jdata.name = myAIname;
			jdata.posx = go.transform.position.x;
			jdata.posy = go.transform.position.y;
			jdata.posz = go.transform.position.z;
			jdata.time = i * 10;//dummy data
				
			string json = JsonUtility.ToJson (jdata);//オブジェクトをJSON文字列に変更

			tempList.Add (json);//LISTにJSONを追加

		}

		timeList1.Add (0, tempList);//このゼロはシーン番号を想定中いずれ,変数で増やす

	}
		

	//番号で表示
	public void numDel(){
		int objNum = int.Parse (numInput.text);//インプットフィールドで受け取った番号をintに変換
		List<string> temp2List = new List<string> ();//一時的なList作成
		temp2List = timeList1 [0];//シーン番号0のJSONをLISTに読み込む
		var myObject = JsonUtility.FromJson<myData>(temp2List [objNum]);//シーンゼロのobjNum番のJSONのみをオブジェクトに変換
		Debug.Log ("X=" + myObject.posx);//デバッグ用
		Debug.Log ("Z=" + myObject.posz);
		Debug.Log ("name=" + myObject.name);
		Debug.Log ("time=" + myObject.time);

	}



}

シーン番号を変数化し,countで長さ出して全部呼び出して再配置するのと,記録するのを作る

あれ,,記録するために,も一個Dictionaryが必要かな?記録する対象を指定するのに使うために

UnityにJSONで複雑な情報をしまっちゃう

 

独自クラスを作成します

[System.Serializable]
public class myData {
	public int id;
	public string name;
	public int time;
	public float posx;
	public float posy;
	public float posz;

}

1行目が単にSerializableとなっているものがあるが,Systemをつけると動く

 

次にこれをDictionaryにインデックス番号(左=key),JSON文字列(右=value)のセットで保存します

この場合のインデックス番号はおそらくインクリメントさせて順序よく再生させた方が無難

 

登録&呼び出しはこちら.今回はテストなのでインデックス番号がオブジェクト番号になっているので,これでは目標のことができない

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

using System.Collections.Generic;//必ず必要

public class dicPractice : MonoBehaviour {


	public GameObject ballPre;
	public InputField numInput;

	Dictionary<int, string> timeList2;

	void Start () {

		timeList2  = new Dictionary<int, string> ();


		//json test
		myData jdata = new myData();

		//キャラn体作成
		for (int i = 0; i < 10; i++) {
			GameObject go = Instantiate (ballPre, new Vector3 (i * 2.0f, 0, 0), Quaternion.identity) as GameObject;
			string myAIname =  "AI" + i.ToString ();
			go.name = myAIname;

			//json
			jdata.id = i;
			jdata.name = myAIname;
			jdata.posx = go.transform.position.x;
			jdata.posy = go.transform.position.y;
			jdata.posz = go.transform.position.z;
			jdata.time = i * 10;//dummy data
				
			string json = JsonUtility.ToJson (jdata);

			timeList2.Add (i, json);
		}
	}
	

	//インデックス番号でJSONを呼び出す
	public void numDel(){
		int objNum = int.Parse (numInput.text);//入力フィールドの文字をintに変換
		var myObject = JsonUtility.FromJson<myData>(timeList2 [objNum]);//ディクショナリのインデックス番号で呼び出したValueをJSON文字列からオブジェクトに変換
		Debug.Log ("X=" + myObject.posx);//オブジェクト内のposxをコンソールに出力以下同じパタン
		Debug.Log ("Y=" + myObject.posy);
		Debug.Log ("name=" + myObject.name);
		Debug.Log ("time=" + myObject.time);
	}

}

keyをシーン番号にするためにはどうすれば,,

Unityで Dictionary

UnityでDictionaryを使う準備

using System.Collections.Generic;//必ず必要

上の方のusingあたりに追記


Dictionaryを宣言

Dictionary<int, GameObject> prefabDic;

prefabDicという名のDictionaryを宣言


Dctionaryを初期化みたいなの

prefabDic = new Dictionary<int, GameObject> ();

をvoid Start(){ の中にかく


キャラ作成しつつDictionaryに登録

	//キャラn体作成
		for (int i = 0; i < 10; i++) {
			GameObject go = Instantiate (ballPre, new Vector3 (i * 2.0f, 0, 0), Quaternion.identity) as GameObject;
			string myAIname =  "AI" + i.ToString ();
			go.name = myAIname;

			prefabDic.Add (i, go);
		}

iはDictionaryの左列に この後で呼び出す番号にしている

goはゲームオブジェクトが入っているので,

prefabDic.Add(i, go);で番号とゲームオブジェクトのセットでDictionaryに追記(Add)される


dictionaryの3番のゲームオブジェクトを消す

GameObject delobj = prefabDic [3];
		Destroy (delobj);

prefabDic[3]で3番のゲームオブジェクトが呼び出されるので,それをDestroyしている

 

Prefabの名前を変える

 

 

たぶんこれで動く?

 

		//キャラn体作成
		for (int i = 0; i < sakusei; i++) {
			GameObject go = Instantiate (myInstance, new Vector3 (i + 1.0f, 0, 0), Quaternion.identity) as GameObject;
			string myAIname =  "AI" + i.ToString ();
			go.name = myAIname;
}

 

3行目 prefabを生成した後,Gameobject goにいれる.これでCloneでなくなる

4行目 forの変数iを利用した名前をAI1みたいにする

5行目 goの名前を4行目の変数 myAInameにする

これでPrefabがそれぞれ別の名前にかわる

ゴール後に前を向く

ゴール後に前を向く場合は,以下の構造でスクリプトが必要

なお,ゴール前に前を向かせるのは金ちゃん走りになるので,上半身のボーンにマスクを書け,別の制御にする必要があると思う

using UnityEngine;
using System.Collections;

public class heading : MonoBehaviour {

	//initialize variable of  nav mesh
	//initialize variable of bool

	//default heading



	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {

		//get navmesh info every frame
		//if  goal this nave mesh
		//then heding call
	
	}



	//new function heading call
	//if custom heading
	//heading to custom vector
	//else no custom heading
	//heading to default vector




}

 

 

A*関係,複数キャラクタを複数のポイントに向かわせる

作成中

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

public class myscript : MonoBehaviour {
	
	public GameObject myInstance;//for prefab
	public GameObject myGoal;//for goal object
	public int sakusei = 10;//chara duplicate count
	public GameObject targetbj;//GameObject of chara target
	Transform targetPos;//位置情報用の変数
	GameObject NavObj;//NavMeshのついているGameObject
	NavMeshAgent myNav;//NavMeshAgent入れ用

	List<Vector3> myPoint = new List<Vector3>();//ゴール地点リスト用

	// Use this for initialization
	void Start () {
		myPoint = new List<Vector3>();//リスト初期化
		myPoint.Add (new Vector3 (0.0f, 0.5f, -5.0f));//リスト項目追加   
		myPoint.Add (new Vector3 (-20f, 0.5f, 14f));
		myPoint.Add (new Vector3 (20f, 0.5f, 14f));

		//ゴール地点3個作成用(テスト)
		GameObject goalObj = Instantiate (myGoal, myPoint [0], Quaternion.identity) as GameObject;
		goalObj.name =  "goal1";
		goalObj = Instantiate (myGoal, myPoint [1], Quaternion.identity) as GameObject;
		goalObj.name =  "goal2";
		goalObj = Instantiate (myGoal, myPoint [2], Quaternion.identity) as GameObject;
		goalObj.name =  "goal3";

		//キャラn体作成
		for (int i = 0; i < sakusei; i++) {
			GameObject go = Instantiate (myInstance, new Vector3 (i + 1.0f, 0, 0), Quaternion.identity) as GameObject;
			string myAIname =  "AI" + i.ToString ();
			go.name = myAIname;
			int divideInt = i % 3;
			if (divideInt == 0) {
				GameObject my1 = GameObject.Find("goal1");
				targetPos = my1.GetComponent<Transform> ();
	
			}else if (divideInt == 1) {
				GameObject my2 = GameObject.Find("goal2");
				targetPos = my2.GetComponent<Transform> ();
			}else if (divideInt == 2) {
				GameObject my3 = GameObject.Find("goal3");
				targetPos = my3.GetComponent<Transform> ();
			}

		myNav = NavObj.GetComponent<NavMeshAgent> ();//Get Nav mesh from current object

			myNav.SetDestination (targetPos.position);//set goal pos of myNav
			myNav.stoppingDistance = 3.0f;//offset distance from goal point...korenaito guriguri suru
			AICharacterControl  myTar  = NavObj.GetComponent<AICharacterControl>();//find component of NabObj
			myTar.target = targetPos;//set Goal variable

		}
	}
	
	// tsukotenai
	void Update () {
	
	}
}

SeriesをSetActive Falseにする

表題の件,

最後の1こがどうしてもデータに残るので,対処療法でとりあえずFalseにするのをTagでやる.

Tagの追加はAddSeriesのときにやってる

		///test
		GameObject[] pairSer = GameObject.FindGameObjectsWithTag ("pairGra");//Sseriesの位置を絶対パスで指定
		foreach(GameObject setObj in pairSer){
		Debug.Log ("set false_" + setObj.name);
		setObj.SetActive (false);//検索したSeriesのオブジェクトを表示/非表示させる
		}

 

非アクティブ(inActive)オブジェクトのFind

GameobjectFindではなく,TransformFindを使うべし

		SeriesParent = GameObject.Find ("Canvas/mainGraph/RadarGraph/Series");//Sseriesの位置を絶対パスで指定

		setObj = SeriesParent.transform.Find ("my" + this.name).gameObject;//Transformでないとfalseのオブジェクトをfindできない
		//Debug.Log (setObj.name);
		setObj.SetActive (false);//検索したSeriesのオブジェクトを表示/非表示させる