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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

8539閲覧

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

kerokero

総合スコア11

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

2クリップ

投稿2016/06/27 12:18

###前提・実現したいこと
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); } }

}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

urahimono

2016/06/28 04:37

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

2016/07/01 02:18

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

回答1

0

ベストアンサー

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

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

イメージ説明

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

BeltConveyor.cs

csharp

1using UnityEngine; 2using System.Collections; 3using System.Collections.Generic; 4 5public class BeltConveyor : MonoBehaviour 6{ 7 [SerializeField] 8 private float m_uvSpeed = 1.0f; 9 [SerializeField] 10 private float m_movePower = 100.0f; 11 [SerializeField] 12 private float m_speedUpPower = 100.0f; 13 [SerializeField] 14 private float m_speedUpTime = 3.0f; 15 16 private Renderer m_render = null; 17 18 private List<Rigidbody> m_hitObjects = new List<Rigidbody>(); 19 20 void Awake() 21 { 22 m_render = GetComponent< Renderer >(); 23 } 24 25 void Start() 26 { 27 StartCoroutine( SpeedUp( m_speedUpTime ) ); 28 } 29 30 void Update() 31 { 32 ScrollUV(); 33 } 34 35 void OnCollisionEnter( Collision other ) 36 { 37 var body = other.gameObject.GetComponent<Rigidbody>(); 38 if( body != null ) 39 { 40 Vector3 addPower = transform.forward * m_movePower; 41 body.AddForce( addPower, ForceMode.Acceleration ); 42 43 m_hitObjects.Add( body ); 44 } 45 } 46 47 void OnCollisionExit( Collision other ) 48 { 49 var body = other.gameObject.GetComponent<Rigidbody>(); 50 if( body != null ) 51 { 52 Vector3 addPower = transform.forward * m_movePower; 53 body.AddForce( -addPower, ForceMode.Acceleration ); 54 55 m_hitObjects.Remove( body ); 56 } 57 } 58 59 /// <summary> 60 /// テクスチャのUV値をスクロールさせて、ベルトコンベアの見た目を表現する 61 /// </summary> 62 void ScrollUV() 63 { 64 var material = m_render.material; 65 Vector2 offset = material.mainTextureOffset; 66 offset += Vector2.up * m_uvSpeed * Time.deltaTime; 67 material.mainTextureOffset = offset; 68 } 69 70 IEnumerator SpeedUp( float i_time ) 71 { 72 while( true ) 73 { 74 // 一定時間ごとにスピードアップ 75 yield return new WaitForSeconds( i_time ); 76 m_movePower += m_speedUpPower; 77 78 // 現在乗っているオブジェクトに対してスピードアップ分力を加える 79 Vector3 addPower = transform.forward * m_speedUpPower; 80 foreach( var body in m_hitObjects ) 81 { 82 if( body != null ) 83 { 84 body.AddForce( addPower, ForceMode.Acceleration ); 85 } 86 } 87 } 88 } 89 90} // class BeltConveyor

BeltPlayer.cs

csharp

1using UnityEngine; 2 3public class BeltPlayer : MonoBehaviour 4{ 5 // 移動に与える力 6 [SerializeField] 7 private float m_movePower = 500.0f; 8 9 // 前回与えた移動の力 10 private Vector3 m_prevVelocity = Vector3.zero; 11 12 void Update() 13 { 14 var body = GetComponent<Rigidbody>(); 15 16 // 前回与えた力の逆方向の力を与えて相殺 17 body.AddForce( -m_prevVelocity ); 18 19 var velocity = Vector3.zero; 20 21 if( Input.GetKey( KeyCode.UpArrow ) ) 22 { 23 velocity += Vector3.forward; 24 } 25 if( Input.GetKey( KeyCode.DownArrow ) ) 26 { 27 velocity += Vector3.back; 28 } 29 if( Input.GetKey( KeyCode.LeftArrow ) ) 30 { 31 velocity += Vector3.left; 32 } 33 if( Input.GetKey( KeyCode.RightArrow ) ) 34 { 35 velocity += Vector3.right; 36 } 37 38 velocity *= m_movePower; 39 body.AddForce( velocity ); 40 41 // 与えた力を保存 42 m_prevVelocity = velocity; 43 } 44 45 46} // class BeltPlayer 47

イメージ説明

投稿2016/07/04 08:38

urahimono

総合スコア714

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kerokero

2016/07/10 14:14

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問