キャラクターを移動歩かせる方法をしょうかいしていきます。まず何かの操作に対して、キャラクター(オブジェクト)を移動(どのように?)、それに対応して、アニメーションを設定すると、歩いたり、走ったり、ジャンプ等をさせることができます
キーボード入力からオブジェクト(プレイヤー操作キャラ)を動かす
キーボード入力に連動してプレイヤー操作キャラを前後左右に動かし、スペースキーでジャンプ(空中でジャンプしないように設定します)
目次 1.ぼくは、こんな感じで勉強していきます 次に何をやるか?とか書いていく 本編は2からです、興味ない方は、そこからみてください 2.まずはキャラクターを移動させる wasdによる前後左右への移動 3.speceキーでジャンプ コレ意外と大変なんだよジャンプをさせる前にコリジョンcollisionから復習していきます 地面にいるときだけ、ジャンプできるようにしてみました。 unityプレイヤーを移動させる2アニメーション編へ
1.ぼくのunity勉強の流れというか、これから始める人もこんな感じがいいかもよ
モチベーション保ちながら、勉強していくためにどうしたらいいか?
特にぼくと同じくらいにはじめた日の浅い人とかは、まずキャラを動かす
これを最初の目標にしたほうがいいと思う。たのしいよ
そのあとは、好みもあると思うけど、僕の場合チュートリアル的なやつは、さらっと読む、そしてぼくの作りたいゲームに使えそうなものだけ、メモる、つまりほぼいきなりゲーム制作をはじめちゃう、ただそれだと必要な知識も飛ばしてしまう可能性があるので、気を付けてやってます、それにチュートリアルとか参考書籍を読むことで、出てくるアイディアもあるし、読んでなかったことで無駄な手順を踏む可能性もある(読んでても無駄な手順を踏みそうな僕(笑))
とにかくモチベなくなってやめてしまうのだけは、さけたいところゲーム制作のためにはじめたのだから、自分の作りたいゲームを作るっていうのが、一番のモチベアップになるはずです、ただ最初から壮大な大作ゲーは、無理なので、徐々に徐々にがいいと思います。と、自分に対しても言っておく(笑)
ページ内のもくじにもどる
このページ作った時に買ったものではないですが、僕の買ったやつの2019版ですかね、どうせ買うなら、最新版、自分の使ってるunityのバージョンと合わせて買いましょう、安心ですよ※このページの内容が丸ごと乗っているわけではないです、この本プラスネット検索が大事かもです
2.キャラクターの移動
まず地面を作る、真っ平らなやつにしていいと思うよ、キャラが動くようになってから
いろいろギミック作ったりしていったほうが、絶対楽しいって
どういう操作にするか決める
・wasd操作でそれぞれ前後左右に動かす
・w(前進)の時だけleft shiftで走る
・マウスの操作で左右の回転
・スペースキーでジャンプ
キー入力があったら変数をtrueにする
キーが離されたら変数をfalseに変える
そして変数がtrueなら進む
※わざわざキー入力があったらbool変数を切り替えてってやる必要今は、ないんだけど
いつの日かリジッドボディー使うときに便利だから、これを採用しました
「w」が押されたらboolをtrueに、そのあとのif文でkey_wがtrueの時移動させる
まず変数でbool(true,false入れるやつ)
・wasdそれぞれ作る俺の場合名前をkey_wとかkey_aみたいな感じで作りました。
if (Input.GetKey(KeyCode.W)) { key_w = true; } if (Input.GetKeyUp(KeyCode.W)) { key_w = false; }
if文カッコ内の条件がtrueの時{}内の処理をするってやつこれを使ってキー入力があったらどうするよって記入します
Input.GetKey だけだと押している間 Downで押したとき1回、Upで離したときになる
これの後の()中が何を押したまたは、離したか、上のやつの場合は、wキーですね、押されているとtureなので{}の中の文が実行されます
Input.GetKeyUpのときは、逆に離したらtrueになって{}内の文が実行されます
次に
if (key_w) { transform.Translate(Vector3.forward * Nspeed * Time.deltaTime); }
さっきやったif文でkey_wがtrueなら{}の中が実行されます
さっきのif文のなかにこれの{}の中の文入れてしまえば、key_wとかいらないんだけど
void Update(){} キー入力は、これの中に
void FixedUpdate(){}物理挙動する動きは、ここのなかにが、望ましいって聞いたからおれはこうやってる
transform.Translate()でオブジェクト(今回は、操作キャラクター)を動かします
()の中にあるVector3.forward、方向は、前に他にもVector3.upとかいろいろあるので調べてね
コレに関して僕は、つまずきました
transform.Translate(Vector3.forward〜〜〜〜)コレは、オブジェクト(操作キャラ)の向きを基準にforward方向に進んでーって意味になります
transform.Translate(transform.forward〜〜〜)コレだとへんな動きになりますw説明できにゃい
とりあえず解説(僕なりの解釈)
下のやつとの違いは、なんだろうって座標の基準の話になるのですが、transform.Translate自体がキャラ(このスクリプトがアタッチされているオブジェクト)を基準にどこどこへ、進めーな感じなのでVector3.forwardが正解なのですtransform.forwardにしてしまうとコレも確かキャラ(略)を基準に前に進めー、なはずなんですが、自分が実験した感じだと、キャラの方向がゲーム開始時のまま(ワールド座標?)のままだといいのですが、キャラの方向を回転とかしてしまうと、よくわからない方向に進んでしまいました、多分自分の向きを2重?に取得して計算されている?からかも?とりあえず俺は、transform.Translate()を使うときは、コレは、キャラの方向を基準に動かすって意味が入っているので()内での方向の指示は、Vector3.まるまるを使うことにしました
アスタリスク*このマークは、掛け算 Nspeedは、自分で作った変数です(ノーマルスピードという意味で自分で名付けました、使いたいなら自分で宣言しておいてください)あとで前に進む、速さを変えたりとかに便利なので作ったほうがよさそうと思いました。
void Updateで使うときは、Time.deltaTime FixedUpdatedeで使うときは、確かTime.fixed.deltaTimeを使うらしい、これは、パソコンや端末の性能がいいとキャラの動きが速くなったり遅くなったりを防ぐためのおまじないと思って動かすときは、これを掛け算しておくことにします。
void FixedUpdateについても物理挙動をしたいオブジェクトの移動処理は、ここでやらないとへんな挙動になることがあるらしいです、今の所物理挙動を処理するときは、コレの中くらいの感じで使ってます。
void Update キーボード等の入力処理に関しては、ここに、なぜかと言うと、コレが一番呼び出されるタイミングが多い(詳しくは、検索して、俺も曖昧にしか理解してないので)
入力抜けがおきないぐらいの(正確ではない)認識してます
Updateで入力をわざわざ変数使って入力したのは、Updateでキー入力を処理してそれをFixedUpdateのif文で変数の真偽で判別して移動処理を行うためだったのです、えっへん
ここまででwasdで前後左右に動くようになったはず
3. スペースキー押したらジャンプ
コレね意外と大変だったかなり検索しまくったよ
地面にいる時しかジャンプできないと言う条件をつけます、コレやらないと空中で永久にジャンプできちゃうよ、ゲームによっては、ありかもしれないけど
でそのやり方 いろんな方法見つけたんだけどレイ使うやつは、難しそうだったのでコライダ使って接触判定してjimenというタグをゲーム内の地面に設定して操作キャラと接触があったら地上にいるっていう変数jimenコレも自分の好きな名前でboolで宣言しといてください
そしてif文のなかでjimenがtrueかつスペースの入力があったらjump_okコレも自分がわかりやすい名前でboolで宣言して条件を満たした時ジャンプする処理をかきます
ながれは、書いたのでまずコリジョンcollisionから復習していきます
OnCollisionEnter(Collision 名前は自由?){} ここの名前は、自由は、まだ実験してないので 参考にしたやつに書かれていた、collisionを使っておくことにします
当たり判定を取り扱う記述でこれのEnterの部分を変えて使える、Enterだと当たった時、Stayに変えると当たっている間、Exitで離れた時
private void OnCollisionStay(Collision collision) { if (collision.gameObject.tag == "jimen") //地面に触れ続けているとき やっとできたできなかった { jimen = true; //理由はgameObject.nameで"jimen"でやってたからplaneになまえつけてねー // Debug.Log("じめんつるー"); //tagはつけてた 今後気を付けるようにw anim.SetBool("jumpwalk", false);//着地したらジャンプアニメを終わらせる }} // 離れた時 private void OnCollisionExit(Collision collision) { if (collision.gameObject.tag == "jimen") //地面から離れた時 { jimen = false; //Debug.Log("じめんふぁるす"); }}
コメント文や、デバッグログの使い方、悪ふざけが入ってますが、これ練習で作ったスクリプトからもってきました
デバッグログは、便利ですよー、なかなか地面判定ができなくてどこが悪いのか調べるのに役立ちます
上のスクリプトで使ったのは、地面に当たった時,離れた時がちゃんと行われているか確認するために使いました、使い終わった後に//を使ってコメントにしましたが、あとから使うときは、また//をはずして実験したりするつもりでやりました
上のスクリプトを解説していきます
private void OnCollisionStay(Collision collision) {}
とりあえずこれの中にコリジョン(接触系)は、書く、くらいの認識でやっています。
{}内に書いてあるif (collision.gameObject.tag == “jimen”) {}
このif文の中身これは、まだ詳しいわけではないのですが(このやり方しかまだわからない)このスクリプトをアタッチしたオブジェクトのコリジョンが”jimen”(スクリプトではなくツールのほうで自分で設定したタグの名前です、ちょっとわかりにくい文章になったので言い直します。
スクリプトをアタッチしたオブジェクトのコリジョンがjimenというタグのついたオブジェクトのコリジョンと接触した場合ture つまり地面に接触しているなら{}を実行してくださいとなる{}ないのjimen=true;を実行しますこのjimenは、boolで前もって宣言しておいてください、Fixed Updateのところでジャンプさせる時のif文で使います。地面から離れた時のやつは、その下のprivate void OnCollisionExit(Collision collision) の中に書かれている通りStayの逆をやりました。
anim.SetBool(“jumpwalk”, false);これは、今回あまり気にしないでください、アニメーションは、今後また別のところでやります
今回の僕のミスったポイント
コメント// にも書かれてるようにif文のなかのcollision.gameObject.tagこれをcollision.gameObject.nameにしてしまったのです、ツールのほうでタグは、設定してあったけど名前は、デフォルトだったのでgameObject.name jimennは存在してなかったのですwでもこの間違いでぼくは、オブジェクトネームでもオブジェクトに設定したタグでも指定できるということがわかりました、やったねw
void Start () { rb = GetComponent<Rigidbody>(); //リジッドボディーを呼び出すよ 忘れないよう注意 anim = GetComponent<Animator>(); } void Update() { if (jimen)//垂直ジャンプ入力判定 { if (Input.GetKeyDown(KeyCode.Space)) { jump = true;//このイフ文なんとなく中に書いてみた //Debug.Log("じゃーんぷ"); anim.SetBool("jumpwalk",true); } }
ジャンプの入力をとります
rb = GetComponent<Rigidbody>(); コメントにも書かれているようにリジッドボディーを使うときには、これをやらないといけないおまじないです。これをやらないと物理挙動の移動方法は、使えませんのでrbという名前は、お好きな名前でじぶんは、rbとかくのがお気に入りです
anim = GetComponent<Animator>();これは、アニメーション関係のおまじないですが今回は、スルーします
まず最初のif文の中にもう一つif文いれました、どうなのかまだ実験できてませんが&&でjimenとスペース入力やってもいいかもですが、なんとなく先に地面判定ってイメージだったのでこうしました
地面に接触しているときスペースキーを入力したらjumpをtrueにします
そして物理挙動なのでfixed Updateにこのjump(bool で宣言してある変数)を使ってジャンプさせます。
if (jump) { rb.AddForce(Vector3.up * Njump * Time.fixedDeltaTime,ForceMode.Impulse);//今度ベロシティーに直して実験する jump = false; }
これでやっとジャンプできました
AddForceは力を加えるかんじです、こんどベロシティー(速度を変えるものらしい)も勉強してみます、ForceMode.Impluseは、「unity addforce 引数」で調べた時出てきたので実験でいれてみました加える力のタイプで、ほかにもいろいろあったので今度ためしてみたいです
動かした後すぐにjump = false;とあるのは、これしとかないとスペースキーの入力とかなくても永久に飛び続けていきます
たいへんだったー
大変だったことまとめ
タグネームとオブジェクトネームを間違えてたのを探すのも大変だったけど
上の文で書いたばかりだけど、永久に自動で上に飛び続けてしまうのを治すためのjump=false;の記入場所の実験かなり大変でした、でもとりあえずジャンプは、できるようになりましたー
コメント