キャラクターを1から作る。
1.スプライトシートを用意する。
2.スプライトエディターで分割する。
問題:Sprite Editorでsliceが押せない。(非活性)
原因:inspectorのSprite ModeがMultipleになっていないから。変更したらApplyで適用して、Sprite Editorを開きなおすとOK.
3.分割したスプライトをAnimationにする。
分割したスプライトを全部選択して、シーンにドラッグする。
4.小さい場合はpixelsPerUnitを変更する。アニメーションの
5.ドラッグした奴にRidgitBody2Dのコンポーネントを追加すると重力の影響を受けるようになる。要は落ちる。
6.タイルマップで床を作って、そこにコライダーを設定する。
7.キャラにもコライダーのコンポーネントを設定すると、そいつの上に乗る。
8.キャラクターにスクリプトでジョイコンのインプットを受け付けるようにする。
スクリプトは下記。Bボタンでジャンプして、アナログスティックで横移動できる。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class JoyStickInput : MonoBehaviour { public float forcePower = 1.0f; private void Start() { Debug.Log("Start"); } // Update is called once per frame void Update() { if (Input.GetKeyDown("joystick button 0")) { Debug.Log("button0"); } if (Input.GetKeyDown("joystick button 1")) { GetComponent<Rigidbody2D>().AddForce(new Vector3(0.0f, forcePower, 0.0f), ForceMode2D.Impulse); Debug.Log("button1"); } if (Input.GetKeyDown("joystick button 2")) { Debug.Log("button2"); } if (Input.GetKeyDown("joystick button 3")) { Debug.Log("button3"); } if (Input.GetKeyDown("joystick button 4")) { Debug.Log("button4"); } if (Input.GetKeyDown("joystick button 5")) { Debug.Log("button5"); } if (Input.GetKeyDown("joystick button 6")) { Debug.Log("button6"); } if (Input.GetKeyDown("joystick button 7")) { Debug.Log("button7"); } if (Input.GetKeyDown("joystick button 8")) { Debug.Log("button8"); } if (Input.GetKeyDown("joystick button 9")) { Debug.Log("button9"); } float hori = Input.GetAxis("Horizontal"); float vert = Input.GetAxis("Vertical"); if ((hori != 0) || (vert != 0)) { Debug.Log("stick:" + hori + "," + vert); Vector3 nowPos = this.gameObject.transform.position; this.gameObject.transform.position = new Vector3(nowPos.x + hori/100, nowPos.y); } } }
9.アニメーションの切り換えを作る。
Defaultのステータスからじゃないとスムーズな切り替えができない。
Any Statusは可能な限り使わない方が良さげ。
あとは、「Has Exit Time」をOFFにして、遷移する時間(Trandision During)を0にするとスムーズにいく。
10.タグとレイヤーについて
タグとレイヤーは使い手による。
レイヤーはレイヤー間の衝突をチェックボックスで判定できるので、そういう使い方できるような使い方が便利。
感覚的にはタグはオブジェクトのプレイヤー、敵、アイテムなどのオブジェクトの種別の識別に、レイヤーは床、壁、ハシゴなどの衝突する環境の識別に利用すればいい気がする。
11.ワンウェイプラットフォーム
また、Collider2DのUsedByEffectorを有効にする必要もあります。
12.オブジェクトが回転する。
Rigidbody2dのConstantsのFreeze RotationでZをONにする。
13.すり抜ける
isTriggerをONにすればいいけど、イベントもOnTriggerExitで取らないとダメ
14.氷の表現
物理の知識が必要。
横移動を座標で+していくのではなく、AddForceでやる必要がある。ただし、そのままだと加速しすぎてしまうので、速度制限を付ける必要がある。
滑って、方向転換するときにも滑るような感じにしたいなら、斜め下方向の力を加える必要がある。
といっても、結局は摩擦係数と摩擦力を大きくするための要素(質量と重力)による気がする。
15.ホバー
横移動と同様にAddForceで力を加えて、速度で制限する必要がある。
16.水の中
Buoyancy Effector 2Dを使えば、浮力を持たせた領域を作れる。あとは、その領域にいるときのステータス制御でおk。
上昇するにはAddForce。
17.バネ
Physic Materialで跳ねるかと思いきや、これはつまりはボールのような物質にするためのものでしかなかった。
だから、プレイヤーがボールならプレイヤーにマテリアル(材質)を適用してやればいい。
じゃあ、バネはというと、乗ったらAddForceでOK。追加で高く飛びたい場合も、ジャンプがAddForceなので追加処理なし!
いいね!
ちなみにSpringJointも試してみたけど、上から力を加えて反発して飛ばす、みたいなのができない。
いや、パラメーター次第でできるんだろうけど、結構大変そう。時間があるときにやった方がいい。
18.オブジェクを押す
RidigitbodyにPhysic Materialを適用すれば押せるようになる。おそらく、摩擦係数が追加されるからだろう。
19.ボールを押す
丸いものを押そうとすると、真横から力を加えてはいけない。つまり同じ大きさのオブジェクトが押しても、横に移動するだけで転がらない。ボールが転がるように力を加えてやる必要がある。
20.動く床
一緒に動いてくれない。
これは床のTransformで動かしているから、物理特性が動いていないってこと。
物理の力でオブジェクトを動かすから、摩擦という物理の力がかかる。見た目だけ同じに動かそうとするなら、衝突しているときに、同じだけ座標を動かすようなことをする必要がある。
もしくは子要素として含めるか。
21.視差を含んだ背景と前景
Pro Camera2Dを使えばできたけど、基本的にはカメラを複数台用意すればよい。
ただ、背景はレイヤーを分けてやらないとできない。
またCanvas単位で背景のレイヤーは作らないといけない。
加えて、座標もワールドワイド(というか座標系)に揃えないといけない。
後は単純に図形のZ座標をちゃんとしておこう。背景、前景云々の以前にゲームの画面がおかしいことになる。
22.ロープ
ボーンで作る。
スプライトエディターで左上の「Sprite Editor」を「Skinning Editor」に変更するとBonesを作れるようになる。
このときスプライトモードはシングル。
23.プレファブの自動生成
Vector3 myPos = this.transform.position; Vector3 createPos = new Vector3(myPos.x + 2.0f, myPos.y, myPos.z); throwingObject = (GameObject)Instantiate(platformPrefab, createPos, Quaternion.identity); throwingObject.transform.parent = _canvas.transform; Vector3 power = new Vector3(100.0f, 200.0f, 0); throwingObject.GetComponent<Rigidbody2D>().AddForce(power);
24.オブジェクトの固定
throwingObject.GetComponent<Rigidbody2D>().constraints = RigidbodyConstraints2D.FreezeAll;
ただし、固定しても力は保存されいてるので、解除した途端に動き出す。