[Unity]1セルずつ徐々に動いてくれるMove関数


しばらくSPIとか座学をやっていて、さっぱりプログラミングなんてしてなかった始末なわけで・・・。

久しぶりにUnityしてみたら何もかも忘れてしまっていたとです。

そんなわけで、久しぶりに真面目にプログラミングしようと思った次第、このC++(DirectX9)のパズルゲームの参考書のコードをC#で実装してみることに。

・・・、C++は読むことは出来てもほとんど書けないので・・・、おいおい勉強していきます^^;

とりあえず1ページ目から。

Unityを使って思っていたことは、当たり判定等をUnityの機能に頼りきってしまい自分では実装しないと甘えていた事。

うっしじゃあ実装してみるか!と意気込んだ矢先、悩ましい事態が起こります。

※Unityではポインタを使用することは推奨されていません。

http://tsubakit1.hateblo.jp/entry/20140325/1395691522

セルを管理して当たり判定をつけようと思っていたのですが、とりあえず当たり判定は次回持ち越しということで。

簡単にキャラクターを動かしてみます。

以下ソース

Move.cs

public class Move : MonoBehaviour { public float timer=0; public int Vx=0; public int Vy=0; public Vector3 CharaPos; public Vector3 BeforePos; public enum STEP{ NONE=-1, STOP=0, MOVE, }; public STEP step=STEP.STOP; // Use this for initialization void Start () { CharaPos = transform.position; BeforePos=transform.position; } // Update is called once per frame void Update () { //timer-- or timer++ timer--; if(this.step==STEP.STOP){ if(Input.GetKeyDown("up")){ this.step=STEP.MOVE; timer = 10; Vy=1; CharaPos.y+=Vy; } if(Input.GetKeyDown("down")){ this.step=STEP.MOVE; timer = 10; Vy=-1; CharaPos.y+=Vy; } if(Input.GetKeyDown("right")){ this.step=STEP.MOVE; timer = 10; Vx=1; CharaPos.x+=Vx; } if(Input.GetKeyDown("left")){ this.step=STEP.MOVE; timer = 10; Vx=-1; CharaPos.x+=Vx; } } //Gradually if(timer>=0&&this.step==STEP.MOVE){ transform.position=new Vector3(CharaPos.x-Vx*timer*0.1f,CharaPos.y-Vy*timer*0.1f,transform.position.z); } // if timer==0 Initiarize if (timer <= 0) { this.step=STEP.STOP; Vx=0; Vy=0; BeforePos=transform.position; } } }

最初は普通に1マスずつ上下左右に瞬間移動するように実装し、その後ゲームらしくヌルっと動くように。

しっかり状態管理している辺り、昔の勉強が役に立っていますんw

その後ステージを作成してセルで管理しようと思ったのですが、上記の問題でとりあえずステージだけ実装することに。

過去作成のスクリプトコピってz軸とy軸を入れ替えただけのものです。

以下ソース

MapGenerator.cs

public class MapGenerator : MonoBehaviour { public GameObject wall; public GameObject defaultwall; private int default_x_max=19; private int default_z_max=19; public TextAsset _layout; public GameObject[] _objs; /// <summary> /// テキストデータのパス /// </summary> private string filePath ="text/layout"; /// <summary> /// 読み込んだテキストデータを格納するテキストアセット /// </summary> public TextAsset stageTextAsset; /// <summary> /// ステージの文字列データ /// </summary> public string stageData; /// <summary> /// ステージの文字列データの添え字 /// </summary> public int stageDataIndex = 0; /// <summary> /// 抽出した文字を格納する変数 /// </summary> public char pattern; /// <summary> /// 待ち時間 /// </summary> private float waitingTime; // Use this for initialization void Start () { ReadTextData (); //これがマップの元になるデータ string map_matrix = "022520000000000000:022220000000000000:022250000000000000:025251111111111110:022220000000000010:000100000000000010:000110000000000010:000010022500000010:000010032200000010:000010052200000010:000011152200000010:000000022200000010:000000000000000010:000000000000002522:000000000000015222:000000000000002222:000000000000000000:000000000000000000"; CreateMapWaku (); CreateMap (stageData); } // Update is called once per frame void Update () { } void CreateMapWaku(){ for(int dx=0;dx<=default_x_max;dx++){ Instantiate(defaultwall,new Vector3(dx,0,0),Quaternion.identity); Instantiate(defaultwall,new Vector3(dx,default_z_max,0),Quaternion.identity); } for(int dz=0;dz<=default_z_max;dz++){ Instantiate(defaultwall,new Vector3(0,dz,0),Quaternion.identity); Instantiate(defaultwall,new Vector3(default_x_max,dz,0),Quaternion.identity); } } void CreateMap(string map_matrix){ string[] map_matrix_arr = map_matrix.Split (':'); // Debug.Log ("map_matrix_arr[0]:"+map_matrix_arr[0]); for(int x=0;x<map_matrix_arr.Length;x++){ // Debug.Log("map_matrix_arr.Length:"+map_matrix_arr.Length); string x_map=map_matrix_arr[x]; for(int z=0;z<x_map.Length;z++){ //Debug.Log("x_map.Length"+map_matrix.Length); int obj =int.Parse(x_map.Substring(z,1)); if(obj==0){ Instantiate (wall,new Vector3(x+1,z+1,0),Quaternion.identity); } } } } void ReadTextData(){ // TextAssetとして、Resourcesフォルダからテキストデータをロードする stageTextAsset = Resources.Load(filePath) as TextAsset; // 文字列を代入 stageData = stageTextAsset.text; //Debug.Log (stageData); // 空白を置換で削除 //stageData = stageData.Replace(" ", ""); } }

適当なCubeとかのプレハブを用意し、AssetフォルダにResources/text/layout.txtを作ればサムネのステージが完成します。

当たり判定はありませんが、1マスずつちゃんとフィットして動いてくれる辺りで十分満足いたしましたヽ(*´∀`)ノ

や、やっぱ毎日プログラミングしないと忘れていくなぁ・・・。

頑張って毎日触りましょう!

以上です!

#Unity #MyNews

Who's Behind The Blog
Recommanded Reading
Search By Tags
まだタグはありません。
Follow "THIS JUST IN"
  • Facebook Basic Black
  • Twitter Basic Black
  • Google+ Basic Black

Also Featured In

    Like what you read? Donate now and help me provide fresh news and analysis for my readers   

© 2023 by "This Just In". Proudly created with Wix.com

This site was designed with the
.com
website builder. Create your website today.
Start Now