![見出し画像](https://assets.st-note.com/production/uploads/images/64040756/rectangle_large_type_2_6ccd8ebefec47643d994c74b7941eee7.png?width=1200)
ダンスゲーを作りたい#37 【画面】プレイセットアップ画面@プレイフェーズ
いよいよ新規画面に入っていきたいと思うのですが、画像系と連携ポップアップは未設定で要素置いただけなので味気ない感じも?
まぁいいでしょう。
画面遷移フロー
基本的に共通にしたいskill選択とキャラ選択のポップアップが表示されるだけです。
裏方の処理が頑張ってくれるイメージですが、単なる選択画面なのでそんなに機能はありません。
ってか全画面そうなのでもうフローいらんくね?とか思ったり?
イメージ
画像がないですがこんな感じです。
一番上はクエスト情報が入ります。まだ表示内容決めてないので空欄ですが。
二段目が使用キャラです。アイコン、レベル、名前、ステータス類が表示されるイメージです。
パーティは複数登録可能で、ホーム画面を参考にスクロールを使って表示させています。
後はスタートと戻るボタンですね。
処理
やりたいこととしては、どのダンジョンにどのキャラでどのskillセットで挑むのかを決めれればOKです。
データの保存は、基本的にマネージャ経由で行うため、OO=XXみたいな感じでほぼ終わります。
コード上は簡単に書けるようにしてますが、実際は、選択するとマネージャ上の仮置き場に選択したキャラ、skillが配置され、それをサーバでチェックしパーティ情報を書き換え、ローカルに保存し、表示を更新、スタート時には保存されているデータ再度サーバチェックするという何とも面倒な流れになってたりはします。
TIPS
ScrollViewでの画面切り替えの実装に画期的かは微妙ですが進歩がありました。
ホーム画面の際も、ボタン入力による移動処理は簡単に想定通り動きますが、タッチ入力で移動されると変な位置で止まる&位置固定が面倒なためRayCastTargetを切ってボタンのみで移動するようにしたかったのですが、
内部にボタンみたいなRayCastTarget切れない要素があるとその上を触ってスクロールした際に動いちゃう問題があり、指スクロールで動いた場合も適正な位置に移動する処理が必要でした。
以前ホーム画面でやっていた時は"画面の1/3以上指が動いたら次のパネルに遷移"+”指が離れたタイミングで、所定のパネル位置でなければ一番近いパネル位置にスクロール”でやっていましたが、Updateを極力使いたくない気持ちがありました。
今回は、まず画面の1/3以上動いたらっていうのはボタン移動を主にしたい基本理念に反するので廃止しました。
指が離れたらの方は、Updateで指が離れたタイミングを監視していましたが、指が離れた&スクロールが動いているの状態を検出できればいいので、ScrollViewのOnValueChanged内で指が離れたかどうかを検出することにしました。
これまではスクロールビューが動いていない時もUpdateで入力を検出していましたが、これでスクロールビューが動いている時のみでよくなります。
public class script : MonoBehaviour{
int _np=0; //パネル番号の実際の値を保存する器
//パネル番号に見えるもの
int nowparty{
//取得時は器を返す
get{
return _np;
}
//代入時は超えてたら0、少なすぎたら最後の値にして保存する
set{
if(value>4){
_np=0;
}else if(value<0){
_np=4;
}else{
_np=value;
}
}
}
//標準の位置リスト
float[] poslist=[0f/5f,1f/5f,2f/5f...の値が入るけど直接は無理なのでどっかで作って]
//ボタン入力で動かす処理
//ボタンからは+1か-1が送られてくる
public void BTScroolMove(int adder){
nowparty=nowparty+adder;
//上記代入時処理で範囲外の値になると勝手にループする
int index=nowparty;
move(index);
}
//指入力で移動されたときに所定位置に戻す処理
//動かしていいかどうか タップするとtrueになる
bool onMove=false;
//ScrollViewのOnValueChanngedに設定する関数
public void OnValueChanged(){
//もしタップされていればOnMoveをtrueに
//タップされずに呼ばれているときはTweenの移動なのでFalseのまま
if(Input.GetMouseButton(0)){
onMove=true;
}
//今触ってなくて、前触っててかつスクロールビューが動いてる場合
if(onMove && !Input.GetMouseButton(0)){
//現在地に最も近い所定位置を探して移動
var nearest = poslist.OrderBy(x => Mathf.Abs( x - GetComponent<ScrollRect>().horizontalNormalizedPosition)).First();
onMove=false;
nowparty=Array.IndexOf (poslist, nearest);
move(nowparty);
}
}
//実際動かす処理
void move(int index){
//スクロールで移動する位置を取得する
float pos = poslist[index];
//DoTweenでその位置にスクロールさせる
ScrollRect scrollRect = GetComponent<ScrollRect>();
scrollRect.DOHorizontalNormalizedPos(pos, 0.2f , false);
}
}
コードはこんな感じです。
以前はInputを受け取るUpdateを走らせるためのマネージャまで作っていたことを考慮すると、ほぼ同じ処理がある程度気持ち的にすっきり書けました。
ただし、スクロールを1pxも動かさずそっと指を離されると、修正処理が走らず変な位置で止まっちゃいます。
これは何とかしたいところですが、もやもやがすっきりしたのでその辺は後々考えます。
今回はここまで。
この記事が気に入ったらサポートをしてみませんか?