コンテストに参加するための課題は、子供たちが約8分かかるスペースに関する小さなゲームを設計することです。 そして、一つのことがありました。 子供たちは興味があるはずです!
キーボードをコントロールに寄付するのは哀れすぎる(そしてあまり面白くない)ので、すべてのコントロールはゲームパッドを介して行われるように計画されました。 Unity3dでゲームパッドを固定する方法とスピーチがあります。
プロジェクトについて少し
宇宙について最初に思いついたのは、制御されたロボットでした。 このアイデアをさらに発展させたのは、レーザーステーションを充電し、接近する彗星から脱出するために、月のバッテリーを見つけなければならないロボットについてのゲームになりました。 もちろん、すべてをしばらく(最大8分間)行う必要がありました。
(驚いたことに、子供たちは管理を含めてゲームが好きでしたが、それについては以下で詳しく説明します)。
地図作成
小さな隅と大きな月の一致でマップを作成するために、マップは障害物とレベル制限として必要な山を備えた地形要素です。
レベルが十分に長くなるためには、ロボットはバッテリーの反対側の角にあり、遠くから見ると非常に小さいです。 バッテリーを遠くから事前に見ることができないため、サイズは偶然選択されませんでした。
運営管理
ハンドコントロール
ロボットには両手があり、ゲームパッドの「菌類」の数もあるため、これを使用するのは理にかなっています。
そして、ここから困難が始まります。 実際には、最初の「真菌」は「マウスX」および「マウスY」と同じように機能しますが(きしみはありますが)、2番目は押してもまったく反応しませんでした。 次に、Googleに座って、Unityが入力制御データを受信する方法について読みました。 2番目(右)の「真菌」を機能させる方法の問題に対する答えがあります。
編集→プロジェクト設定→入力に進みます
クリックした? 次に、InputManagerがインスペクターウィンドウに表示されます。
最初に18個の入力パラメーターがありますが、さらに必要です。 したがって、ゲームパッドの2番目の「真菌」のX軸とY軸に22があり、最初の「真菌」へのアピールの名前を分離するためにさらに2つあります。
さらに、マウス(マウスX)の動きとの類推により、新しい入力値を入力して名前を変更します(名前はプログラムで参照するため、非常に重要です)。
lp_right.transform.Rotate(0、Input.GetAxis( "Hor2_j")、0);
yr + = Input.GetAxis( "Hor2_j");
lp_right.transform.Rotate(Input.GetAxis( "Vert2_j")、0、0);
xr + = Input.GetAxis( "Vert2_j");
lp_left.transform.Rotate(0、Input.GetAxis( "Hor_j")、0);
yl + = Input.GetAxis( "Hor_j");
lp_left.transform.Rotate(Input.GetAxis( "Vert_j")、0、0);
xl + = Input.GetAxis( "Vert_j");
ムーブメント
マップは地形上に構築されるため、座標に沿って移動するとゲームに悪影響を与えることに注意してください。 したがって、物理学を使用することが決定されました。 これは、一方で通過する関心を高め、他方でいくつかの問題を同時に解決します(不均一な動き、ジャンプ、フェンス越しの飛行)。
そのため、ロボットに配置する必要があるリジッドボディが必要です。次に、好みに合わせて(プロジェクトでは質量を100に設定し、残りはそのままにします)。
コードには2つのトリックしかありません。 1つ目はGetComponent()で、特にRigidbodyとAddforceで動作します。 2番目は数学です。 ロボットがどこを望んでいるのかを知るだけでなく、どこを見ているのかを知ることも必要です。 これを行うには、transform.eulerAngles.yを使用し、それをラジアンに変換し、x座標とz座標のコサインとサインをそれぞれ取ります。
y=bot.transform.eulerAngles.y*(Mathf.PI/180); if(Input.GetKey(KeyCode.JoystickButton4)||Input.GetKey(KeyCode.JoystickButton0)) { s="Go_to"; bot.GetComponent<Rigidbody>().AddForce(new Vector3(Mathf.Cos(y),0,-Mathf.Sin(y))*15); } if(Input.GetKey(KeyCode.JoystickButton5)||Input.GetKey(KeyCode.JoystickButton2)) { s="Go_back"; bot.GetComponent<Rigidbody>().AddForce(-new Vector3(Mathf.Cos(y),0,-Mathf.Sin(y))*15); } if(Input.GetKey(KeyCode.JoystickButton6)||Input.GetKey(KeyCode.JoystickButton3)) { s="Turn_left"; bot.transform.Rotate(0,-0.5f,0); } if(Input.GetKey(KeyCode.JoystickButton7)||Input.GetKey(KeyCode.JoystickButton1)) { s="Turn_right"; bot.transform.Rotate(0,0.5f,0); }
ご覧のとおり、アクションは2つのボタンで示されます。 これは、繰り返し使用中にバンパー(L1、L2、R1、R2)が破損/固着した場合に行われます。
時間
Unityの現在の時刻を明確にするために、System.DateTime.Nowを使用して、1日の始まりから経過した時間を秒単位で計算できます。 この時間制限方法には、時計を23:59から00:00に切り替えるというデメリットがありますが、ゲームはすぐにプレイされ、日中に競技が開催されるため、無視することができます
2つのヒント
- 日、月、年でカウントします。 1970年1月1日から経過した秒数を示すTurboC ++でこのような関数を見たとき
- C#のタイマーと呼び出し関数について読む
制限時間は、スクリプトの実行後の時間の差(開始()を回避)と現在の状態(更新)として考えることができます。
void Start () { time = System.DateTime.Now.Hour * 3600 + System.DateTime.Now.Minute * 60 + System.DateTime.Now.Second; } void Update () { win = PlayerPrefs.GetInt ("win"); lose = PlayerPrefs.GetInt ("lose"); t = System.DateTime.Now.Hour * 3600 + System.DateTime.Now.Minute * 60 + System.DateTime.Now.Second; if((win+lose)==0) PlayerPrefs.SetInt("time",480-(t-time)); if((480-(t-time))==0) PlayerPrefs.SetInt ("lose",1);
あとがき
ロボットが加速して動き、誰もが喜んで使用したので、子供たちはゲームが好きでした。
衝突する前にバッテリーをキャッチすることは特に興味深いものでした。これは、バッテリーも剛体であり、移動の方向を取得するからです。 手のゆっくりした動きと組み合わせて、それは非常にうまくいった。
この記事が、ゲームパッドをプロジェクトにねじ込んで夜遅くまで座ってはいけないことを願っています!
PS Unity3d 5.0 用に組み立て、作成、テストしました。 リンクをダウンロードできます