ゲーム制作日記

ゲーム制作に使ったもの

 

キャラクターを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;

ただし、固定しても力は保存されいてるので、解除した途端に動き出す。

 

-ゲーム制作日記