昨年、Macの使い方がわからなーい!
と嘆いた記事を初めて書いてから1年以上が経ちました。
今はqnoteに入社してMacもそこそこ?使いこなしていると思っている新人。
家ではWindowsを使ってるんですが、変換する時ついついスペースの横を押しちゃうくらいMacに染まりつつあります。
#本題へ
今回はUnityでキャラをジャンプさせるお話。
ほぼ独学でちょっとしたゲームを作っているのですがUnityは奥が深い。使いこなすなんて到底無理!わからない機能ばかり。。。
今度は、Unityの使い方がわからなーい!って記事書けばいいんですかね。。。
冗談は置いときまして本題ですね。
脱線しまくってて申し訳ないです。
というわけで、備忘録も兼ねて書きたいと思います。
先ほどからUnityと言っていますが、正しくはUnity2Dで作成してます。
ジャンルはラン&ジャンプ(ウインドランナー的なあれ)で題名がラン&コナンです。(嘘です)
UnityとMonoDevelopを使います。
使用言語はC#です。
今回参考にさせていただいたサイトはこちら
#ジャンプさせる前に地面に立たせる
現在の画面はこんな感じ
背景、地面はAssetStoreから「2d platformer summer (package4)」をダウンロードして使用しました。
キャラクターはプロジェクト作成時に入れられる「Standard Assets」の中からロボットくんを使用しました。
地面に「BoxCollider2D」ロボットくん上半分に「BoxCollider2D」と下半分に「CircleCollider2D」を追加して地面に立つようにします。
余談になりますが
なぜ、ロボットくんに2つColliderを設定するのか。
BoxColliderだけにしてしまうと段差などで引っかかってしまうんですよね。
そのため下半分にはCircleColliderを設定して段差で引っかからないようにします。
#クリックでジャンプ
いよいよジャンプさせてみます!
ロボットくんにC#スクリプトを追加します。
void FixedUpdate()
{
if (Input.GetMouseButtonDown(0))
{
regidbody2D.AddForce(Vector2.up * 250);
}
}
簡単に書くとこれだけでジャンプできちゃいます。
しかし、このままだと地上、空中関係なく無限にジャンプできてしまうので、地面に接地している時だけジャンプできるようにしましょう。
[SerializeField]
bool jump = false;
void FixedUpdate()
{
jump = Physics2D.Linecast(transform.position,
transform.position - transform.up * 1, ground);
if (Input.GetMouseButtonDown(0) && jump)
{
regidbody2D.AddForce(Vector2.up * 250);
}
}
これで地面に接地している時だけジャンプできるようになります。
Physics2D.Linecastを使うと自分の「Collider」と「指定したレイヤーのCollider」の当たり判定を判断してくれます。
実際にスクリプトを反映したスクショを貼って説明します。
白い線が入ってるのがわかると思いますが、これが地面と接地している時だけジャンプします。
transform.position
は開始点となりここを基準に下へ伸びています。
transform.position - transform.up * 1
これが開始点からどれだけ伸ばすかというコードになります。
長さは自分で調節する必要がありますね。
最後の
ground
はレイヤー名です。
ここは自分の好きなレイヤー名をつけて構いません。
ただし、オブジェクトに付けたレイヤー名と一致していないと意味ないのでご注意ください。
#まとめ
AdventCalendarに初めて参加させていただきました。
現在業務でもUnityを使っているのでまたUnityのことに関して書けたらなと思います。
※ジャンプスクリプトUpdateと書いていましたが、AddForceを使う場合はFixedUpdateを使います。