生徒用-Unity玉を動かす

シーンの作成

FileのNew Sceneからシーンを作成する

Basic選択でCreate

作成後はコントロール+Sで任意の名前をつけてセーブ

今回はmainというシーンで保存

シーン名が変わる

ステージとプレイヤーの制作

hierarchy左上の+アイコンの3Dobjectからcubeとsquareを作成し、Cubeでステージを作る

squareにリジッドボディを追加

再生すると落ちるようになる。

さらにsquareにNewスクリプトを追加名前はplayercontroller

アセットにできたplayercontrollerを開く

下のコードを記述する。

using UnityEngine;

public class playercontroller : MonoBehaviour
{
public float torque = 10f; // 回転の強さ

private Rigidbody rb;

void Start()
{
    // Rigidbody コンポーネントを取得
    rb = GetComponent<Rigidbody>();
    if (rb == null)
    {
        Debug.LogError("Rigidbodyがアタッチされていません。");
    }
}

void Update()
{
    // 矢印キーの入力を取得
    if (Input.GetKey(KeyCode.RightArrow))
    {
        // 右矢印キーで右方向に回転
        rb.AddTorque(Vector3.back * torque);
    }
    else if (Input.GetKey(KeyCode.LeftArrow))
    {
        // 左矢印キーで左方向に回転
        rb.AddTorque(Vector3.forward * torque);
    }
    else if (Input.GetKey(KeyCode.UpArrow))
    {
        // 上矢印キーで前方向に回転
        rb.AddTorque(Vector3.right * torque);
    }
    else if (Input.GetKey(KeyCode.DownArrow))
    {
        // 下矢印キーで後方向に回転
        rb.AddTorque(Vector3.left * torque);
    }
}

}

以下他の動かし方

1. Transformの回転を直接操作する

transform.Rotate メソッドを使って、オブジェクトを特定の角度で回転させます。

void Update()
{
float rotationSpeed = 100f;
if (Input.GetKey(KeyCode.RightArrow))
{
// Y軸周りに時計回りの回転
transform.Rotate(Vector3.up * rotationSpeed * Time.deltaTime);
}
else if (Input.GetKey(KeyCode.LeftArrow))
{
// Y軸周りに反時計回りの回転
transform.Rotate(Vector3.down * rotationSpeed * Time.deltaTime);
}
}
  • メリット: Rigidbodyが不要。
  • デメリット: 物理演算(摩擦や慣性など)が考慮されない。

2. Rigidbodyの角速度を操作する

Rigidbody.angularVelocity プロパティを使用して、回転速度を直接制御します。

void Update()
{
float angularSpeed = 5f;
Rigidbody rb = GetComponent<Rigidbody>();

if (Input.GetKey(KeyCode.RightArrow))
{
rb.angularVelocity = new Vector3(0, angularSpeed, 0);
}
else if (Input.GetKey(KeyCode.LeftArrow))
{
rb.angularVelocity = new Vector3(0, -angularSpeed, 0);
}
else
{
rb.angularVelocity = Vector3.zero; // 停止
}
}
  • メリット: 物理演算を活用できる。
  • デメリット: トルクのような「力」ではなく、直接速度を変更するのでリアルな挙動ではない。

3. Positionを直接変更する

回転ではなく、オブジェクトの位置を直接操作することで動かす方法。

例: 平行移動

void Update()
{
float moveSpeed = 5f;
Vector3 move = Vector3.zero;

if (Input.GetKey(KeyCode.UpArrow))
{
move = Vector3.forward * moveSpeed * Time.deltaTime;
}
else if (Input.GetKey(KeyCode.DownArrow))
{
move = Vector3.back * moveSpeed * Time.deltaTime;
}

transform.position += move;
}
  • メリット: 非常に簡単。
  • デメリット: 物理演算が考慮されない。

4. Rigidbodyの速度を設定する

Rigidbody.velocity を使ってオブジェクトを移動させます。

例: 移動

void FixedUpdate()
{
float moveSpeed = 5f;
Rigidbody rb = GetComponent<Rigidbody>();

if (Input.GetKey(KeyCode.UpArrow))
{
rb.velocity = Vector3.forward * moveSpeed;
}
else if (Input.GetKey(KeyCode.DownArrow))
{
rb.velocity = Vector3.back * moveSpeed;
}
else
{
rb.velocity = Vector3.zero; // 停止
}
}
  • メリット: 物理エンジンを活用。
  • デメリット: 慣性や摩擦を直接扱いにくい場合がある。

5. Quaternionを使って回転

Quaternion を直接操作してオブジェクトの回転を変更します。

void Update()
{
float rotationSpeed = 100f;

if (Input.GetKey(KeyCode.RightArrow))
{
transform.rotation *= Quaternion.Euler(0, rotationSpeed * Time.deltaTime, 0);
}
else if (Input.GetKey(KeyCode.LeftArrow))
{
transform.rotation *= Quaternion.Euler(0, -rotationSpeed * Time.deltaTime, 0);
}
}
  • メリット: 回転をより細かく制御できる。
  • デメリット: 初心者には少し複雑。

コメント