【Unity2d】区間スクロールの左右版実装

Unity2D

Unity2D ARPG

こんにちは。なおキーヌです。

ブログ毎日更新は359日目になります。

前回の補足となってしまうのですがしっかりと固めていきましょう。
画面スクロール上下が出来るようになったので、そのまま左右スクロールも実装してしまいます。

ついでにスクロールによる微妙な位置ズレも補正します。

左右スクロールの実装

上下スクロールが実装できたのなら左右は簡単ですね。

ただ、左右は左がマイナス右がプラスと数値が変わるのに注意してください。

早速実装していきましょう。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Move_Camera : Move_Manager
{
    // カメラオブジェクト
    private GameObject _MainCamera;
    // プレイヤーステートスクリプトの取得
    private State_Player _State;

    private float _ScrollSpeed = 30;

    // 縦スクロール量
    private int _vScroll = 192;
    private int _vDefaultScroll = 136;
    // 横スクロール量
    private int _hScroll = 288;
    private int _hDefaultScroll = 528;


    // 更新処理
    protected override void Start() {
        // プレイヤーオブジェクトの取得
        _MainCamera = GameObject.FindGameObjectsWithTag("MainCamera")[0];
        _State = GameObject.FindGameObjectsWithTag("State_Manager")[0].GetComponent<State_Player>();
    }
    protected override void Update() {
        _areaScroll(_State.GameSceneState);
    }

    // ステートが1-4だとスクロールする
    private void _areaScroll(int scrollNo) {
        switch(scrollNo) {
            case 1:
                // カメラオブジェクトを移動させる
                _MainCamera.transform.Translate(0, -_ScrollSpeed/10, 0);
                // _vScrollで割り切れたらスクロール停止(切り捨て
                if( (Math.Floor(_MainCamera.transform.position.y)-_vDefaultScroll) % _vScroll == 0) {
                    _State.setSceneControl(0);
                }
                break;
            case 2:
                _MainCamera.transform.Translate(0, +_ScrollSpeed/10, 0);
                // _vScrollで割り切れたらスクロール停止(切り上げ                
                if( (Math.Ceiling(_MainCamera.transform.position.y)-_vDefaultScroll) % _vScroll == 0) {
                    Debug.Log(Math.Ceiling(_MainCamera.transform.position.y));
                    _State.setSceneControl(0);
                }
                break;
            case 3:
                // カメラオブジェクトを移動させる
                _MainCamera.transform.Translate(_ScrollSpeed/10,0, 0);
                // _vScrollで割り切れたらスクロール停止(切り捨て
                if( (Math.Ceiling(_MainCamera.transform.position.x)-_hDefaultScroll) % _hScroll == 0) {
                    _State.setSceneControl(0);
                }
                break;
            case 4:
                _MainCamera.transform.Translate(-_ScrollSpeed/10, 0, 0);
                // _vScrollで割り切れたらスクロール停止(切り上げ                
                if( (Math.Floor(_MainCamera.transform.position.x)-_hDefaultScroll) % _hScroll == 0) {
                    _State.setSceneControl(0);
                }
                break;
        }
    }

}

このようにxの場合は_h~で定義した変数を使って記述します。

これで横の時と縦の時のスクロール処理ができました。

次にUnityエディタ側でエリアの区切りに該当する衝突判定を置きます。

Unity2D 衝突判定一覧

横スクロールになる衝突判定のタグは「AreaChangeH」にしていきましょう。

こうすることで前回の_ObjectCollisionに記載した分岐の判定ができるようになります。

エリアスクロールの管理

現状、数値を変動させてスクロールしていますが現状プレイヤーがいる場所というのが
オブジェクトの位置でしかわからない状態になっています。

上手く動かないので次回に回しているのですが、プレイヤーの現在値や
カメラの座標位置などを保存しておく変数が必要になります。

プレイヤーの現在値を記憶しておくと処理を作るのが楽になるだけではなく、
ダンジョンマップの機能を作るときに活用できるのでどちらにしろ必要になります。

スクロール位置の補正について

エリア移動を行うと少し座標がズレたりすることがあります。

それにともないエリアスクロールが完了したら位置補正をしてあげる必要があります。

一旦作ってみたはみたのですが、スクロール補正処理にちょっとてこずってるので次回に回します。

それでは。