質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.13%

Unityでベルトコンベア作りたい

解決済

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 5,880

kerokero

score 11

前提・実現したいこと

Unityでベルトコンベア上を走り障害物を躱してゴールを目指すゲーム

発生している問題・エラーメッセージ

ベルトコンベア上の物体(障害物・Player)を全て一定の方向に動かしたいのですが障害物のみしか動いてくれません、色々試してみたのですがどうにも上手くいかないです。どうか助けてください。

一定時間経過するとスピードが上がる処理もわかればお願いします。

該当のソースコード

using UnityEngine;
using System.Collections;

public class BeltConveyor : MonoBehaviour {

public Vector3 direction;
public float power;
public Material mater;

void OnCollisionStay(Collision other) {
Rigidbody body;
if (body = other.gameObject.GetComponent<Rigidbody>()) {
var dir = transform.TransformDirection(direction);
body.MovePosition(other.transform.position + dir * power * Time.fixedDeltaTime);
}
}
void OnCollisionExit(Collision other) {
Rigidbody body;
if (body = other.gameObject.GetComponent<Rigidbody>()) {
body.AddForce(direction * power, ForceMode.Impulse);
//Destroy(other.gameObject, 1);
}
}
}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • urahimono

    2016/06/28 13:37

    一つ質問させてください。
    Playerの移動制御はどのように行っているのでしょうか。
    Playerの移動制御のスクリプトも一緒に記載していただけると、助言がしやすくなる思います。
    あと、コードの部分をマークダウン方式の```で括って記述していただけると、読みやすくてうれしいです。

    キャンセル

  • kerokero

    2016/07/01 11:18

    Playerの移動制御はまだできていませんがオートで前進させてカーソルで横移動するつもりです。指摘ありがとうございます。

    キャンセル

回答 1

checkベストアンサー

+1

MovePosition()は移動先の位置を指定してその位置に移動させる関数なので、今回のようにベルトコンベアの移動処理とプレイヤーの移動処理と複数の移動処理が同時に発生すると、正しく処理されない可能性が出てきます。

以下の例ではAddForce()を利用して移動制御をしています。
MovePosition()と違って力を与えている形になるので、与える値の単位が違うのと摩擦がかかるのに気を付けてください。
摩擦0のPhysicMaterialを作成してベルトコンベアにつけて、力が減衰しないようにしています。

イメージ説明

作成されるゲーム的にどこまで参考になるかはわかりませんが、使えそうな処理は使ってみてください。

BeltConveyor.cs

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class BeltConveyor : MonoBehaviour
{
    [SerializeField]
    private float       m_uvSpeed       = 1.0f;
    [SerializeField]
    private float       m_movePower     = 100.0f;
    [SerializeField]
    private float       m_speedUpPower  = 100.0f;
    [SerializeField]
    private float       m_speedUpTime   = 3.0f;

    private Renderer    m_render    = null;

    private List<Rigidbody> m_hitObjects    = new List<Rigidbody>();

    void Awake()
    {
        m_render    = GetComponent< Renderer >();
    }

    void Start()
    {
        StartCoroutine( SpeedUp( m_speedUpTime ) ); 
    }

    void Update()
    {
        ScrollUV();
    }

    void OnCollisionEnter( Collision other )
    {
        var body = other.gameObject.GetComponent<Rigidbody>();
        if( body != null )
        {
            Vector3 addPower = transform.forward * m_movePower;
            body.AddForce( addPower, ForceMode.Acceleration );

            m_hitObjects.Add( body );
        }
    }

    void OnCollisionExit( Collision other )
    {
        var body    = other.gameObject.GetComponent<Rigidbody>();
        if( body != null )
        {
            Vector3 addPower = transform.forward * m_movePower;
            body.AddForce( -addPower, ForceMode.Acceleration );

            m_hitObjects.Remove( body );
        }
    }

    /// <summary>
    /// テクスチャのUV値をスクロールさせて、ベルトコンベアの見た目を表現する
    /// </summary>
    void ScrollUV()
    {
        var material                = m_render.material;
        Vector2 offset              = material.mainTextureOffset;
        offset                     += Vector2.up * m_uvSpeed * Time.deltaTime;
        material.mainTextureOffset  = offset;
    }

    IEnumerator SpeedUp( float i_time )
    {
        while( true )
        {
            // 一定時間ごとにスピードアップ
            yield return new WaitForSeconds( i_time );
            m_movePower += m_speedUpPower;

            // 現在乗っているオブジェクトに対してスピードアップ分力を加える
            Vector3 addPower = transform.forward * m_speedUpPower;
            foreach( var body in m_hitObjects )
            {
                if( body != null )
                {
                    body.AddForce( addPower, ForceMode.Acceleration );
                }
            }
        }
    }

} // class BeltConveyor

BeltPlayer.cs

using UnityEngine;

public class BeltPlayer : MonoBehaviour
{
    // 移動に与える力
    [SerializeField]
    private float   m_movePower = 500.0f;

    // 前回与えた移動の力
    private Vector3 m_prevVelocity  = Vector3.zero;

    void Update()
    {
        var body        = GetComponent<Rigidbody>();

        // 前回与えた力の逆方向の力を与えて相殺
        body.AddForce( -m_prevVelocity );

        var velocity    = Vector3.zero;

        if( Input.GetKey( KeyCode.UpArrow ) )
        {
            velocity   += Vector3.forward;
        }
        if( Input.GetKey( KeyCode.DownArrow ) )
        {
            velocity   += Vector3.back;
        }
        if( Input.GetKey( KeyCode.LeftArrow ) )
        {
            velocity   += Vector3.left;
        }
        if( Input.GetKey( KeyCode.RightArrow ) )
        {
            velocity   += Vector3.right;
        }

        velocity   *= m_movePower;
        body.AddForce( velocity );

        // 与えた力を保存
        m_prevVelocity  = velocity;
    }


} // class BeltPlayer

イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/10 23:14

    ありがとうございます!ベルトコンベアがベルトコンベアしてます!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる