横スクロール


サンプル2


可変長のパーツに対応、各パーツがバラバラの大きさでもうまく動くようになっている
スクロールの際、3パーツ全幅の1/2をカメラが越えた際、各パーツが右にワープして並びなおす仕組みなのは同じ


using UnityEngine;
using System.Collections;

public class loop : MonoBehaviour
{
  
   Transform player;
   float xSize = 0.0f;
   Vector3 playerInitPos, playerDistance;
   Vector3 myInitPos;
   
   void Awake ()
   {
       GameObject[] loopBackGround = GameObject.FindGameObjectsWithTag ("loopBackGround");
       foreach (GameObject item in loopBackGround) {
           xSize += ((item.GetComponent<MeshFilter> ().mesh.bounds).size.x * item.transform.localScale.x);
       }
       player = GameObject.FindGameObjectWithTag ("Player").GetComponent<Transform> () as Transform;
       myInitPos = this.transform.position;
       playerInitPos = player.position + myInitPos;
       playerDistance = Vector3.zero;
   }
   
   int x;

  void Update ()
   {
       playerDistance = player.position - playerInitPos;
       x = Mathf.RoundToInt (playerDistance.x / xSize);
       this.transform.position = myInitPos + new Vector3 (x * xSize, 0, 0);
   }
}



サンプル1


背景素材を3ブロック分用意して右にスクロールさせてゆく
スクロールの際、3パーツ全幅の1/2をカメラが越えた際、各パーツが右にワープして並びなおす仕組み

<カメラ>


using UnityEngine;
using System.Collections;

public class CustumCameraControl : MonoBehaviour {
  
   GameObject player;
   public Vector3 offset;
   
   // Use this for initialization
   void Start () {
       this.player = GameObject.FindGameObjectWithTag("Player");
       this.offset = this.transform.position - this.player.transform.position; 
   }
   
   // Update is called once per frame
   void Update () {
       this.transform.position = new Vector3(
           this.player.transform.position.x +this.offset.x,    //プレーヤーの横座標のみを追いかける 
           this.transform.position.y,
           this.transform.position.z);
       //yzはカメラ初期位置の高さと奥行きで固定
   }
}

<背景パーツ>
これは各背景パーツにコンポーネントとして割り当てて成立させている

using UnityEngine;
using System.Collections;

public class custumFloorCtrl : MonoBehaviour {
  
   public    static float WIDTH = 10;
   //素材パーツの幅(本のデータでは横40ユニットで構成していた。その方がワープが見えなくて良いと思う) 
   public    static    int    MODEL_NUM=3;    //構成する数
   float totalWidth;
   
   // Use this for initialization
   void Start () {
       totalWidth = WIDTH * MODEL_NUM;
   }
   
   // Update is called once per frame
   void Update () {
       Vector3 camPos=    Camera.mainCamera.transform.position;
       Vector3 floorPos = transform.position;
       if( camPos.x > totalWidth/2 + floorPos.x ){
           floorPos.x += totalWidth;                    //素材パーツの全幅分動かせば計算はあう 
           this.transform.position = floorPos;            //ワープさせるのでpositionが良い
       }
   }
}

<背景パーツ改良版>

using UnityEngine;
using System.Collections;

public class custumFloorCtrl : MonoBehaviour {
  
   public    static float WIDTH = 10;    //素材パーツの幅
   public    static    int    MODEL_NUM=3;    //構成する数
   float totalWidth;
   Vector3 initialPos;
   
   // Use this for initialization
   void Start () {
       totalWidth = WIDTH * MODEL_NUM;
       initialPos = transform.position;
   }
   
   // Update is called once per frame
   void Update () {
       Vector3 camPos=    Camera.mainCamera.transform.position;
       Vector3 floorPos = initialPos;
       
       float dist = camPos.x - initialPos.x;
       float n = Mathf.RoundToInt( dist / totalWidth );    //今までの移動距離をパーツトータル幅で割って四捨五入 
       print(n);
       
       floorPos.x = initialPos.x + totalWidth * n;            //位置あわせ
       transform.position = floorPos;
       
   }
}

メニュー



  • 最終更新:2014-06-13 12:10:05

このWIKIを編集するにはパスワード入力が必要です

認証パスワード