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
60
61
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
