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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

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

Unity

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

Q&A

解決済

1回答

2877閲覧

【Unity】Scroll viewで範囲外の物を選択したとき、選択物が範囲内に収まるように動かしたい

Y0241-N

総合スコア1066

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2019/07/29 06:52

編集2019/07/29 08:07

実現したいこと

追記:動かすことはできたが、どれぐらい動かすかの値の調整がうまくいきません。
こんな具合でずれが生じる。
イメージ説明

動かすコードは以下の通りです、0.1fが加算の固定値ですが、これを要素数に応じて適切な値にしたいと思いますが、
どういう計算式になるでしょうか?なんとなく、1÷(要素のyの数値)か 1÷(要素の総数)あたりかなぁと思います。

C#

1 if(EventSystem.current.currentSelectedGameObject.GetComponent<RectTransform>().position.y >= 900 ) 2 { 3 ScrollRect.verticalNormalizedPosition = ScrollRect.verticalNormalizedPosition + 0.1f; 4 5 }else if( EventSystem.current.currentSelectedGameObject.GetComponent<RectTransform>().position.y <= 120 ) 6 { 7 ScrollRect.verticalNormalizedPosition = ScrollRect.verticalNormalizedPosition - 0.1f; 8 }

~~~~~~~以下解決済み~~~~~~~

文字での説明が難しいので、GIFをまずご覧ください。
イメージ説明

このように現在、縦スクロールの中に複数の要素を挿入し、選択できるようにしていますが、
Viewの範囲外にあるものを選択すると、当然選択しているものが見えなくなってしまうので、
これを範囲外の物を選択したとき、自動的にView内に収まるように調整したいです。
イメージ説明

現状、これを実現する方法が全く思いつかず、いろいろと記事を調べてはみましたが、
スクロールをスナップする記事はあれど、選択を変更したときにスナップする、という挙動を
行っている記事はなかったため、知恵をお借りしたく思います。

試したこと

選択している物のポジションを取得し、Scroll viewの範囲外のポジションになったときに、スクロールバーの座標を動かそうとしたが、
要素数が変動した時に、固定値を渡しているとずれが生じる。

補足情報(FW/ツールのバージョンなど)

スクロールはtubaki様のInfinite Scrollをお借りしています。
よろしくお願いいたします。

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

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

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

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

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

izmktr

2019/07/29 07:14

試したことの部分をもうちょっと詳しくかけますか? 方法はそれで正しいはずです 固定値がなにかわかりませんが、通常はその値はプロパティから取得したり計算で求めたりします
Y0241-N

2019/07/29 08:08

ご指摘の内容を修正いたしました。 実は試したことの部分は机上の空論でした...、なんとなくこんな感じでできるんじゃないかなと思っただけで、実際には試していませんでした。申し訳ありません。
guest

回答1

0

自己解決

度重なる検証の末、自己解決しました。
詳しい方法は別途記事にまとめるとして、移動させる値の算出方法のみ記載しておきます。

まず、範囲外にあるものを選択したときの判定と移動(posを""で囲っているのは強調するためです、実際には外します)
.

C#

1 if(EventSystem.current.currentSelectedGameObject != null) 2 { 3 if(EventSystem.current.currentSelectedGameObject.GetComponent<RectTransform>().position.y >= 889 ) 4 { 5 ScrollRect.verticalNormalizedPosition = ScrollRect.verticalNormalizedPosition + "pos"; 6 7 }else if( EventSystem.current.currentSelectedGameObject.GetComponent<RectTransform>().position.y <= 138 ) 8 { 9 ScrollRect.verticalNormalizedPosition = ScrollRect.verticalNormalizedPosition - "pos"; 10 } 11 }

次にposについてですが、この値が範囲外の物を選択し際に、どれだけスクロールバーを移動させるかの値になります。
つまり、この値が適正値でないとこのように移動した際にズレが生じます。イメージ説明

posの値は1 ÷( 要素数 - 表示可能な要素数)で算出できました。

「1」はスクロールバーの移動が0~1の間で管理されているため、その総数である1。
「要素数」はスクロールコンテンツとして登録する総数、上記GIFでいうと「20」にあたります。
「表示可能な要素数」はスクロールビューで定めた範囲内に収めることのできる要素数なので、上記GIFでは「11」にあたります。

コードで書くとこうなります

float pos = 1f/( (float)MyItem.rowLength - 11f); //MyItem.rowLengthが20にあたります、intで宣言しているので、floatに置換しています。

これで要素数が変動した際も、手動で調整することなくズレが生じずに移動するようになりました。
イメージ説明

投稿2019/07/30 05:07

Y0241-N

総合スコア1066

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問