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

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

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

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

Unity

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

Q&A

解決済

1回答

2775閲覧

【Unity】Vector3.Lerpの線形移動がずれる

nakamu

総合スコア82

C#

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

Unity

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

0グッド

0クリップ

投稿2020/01/27 09:42

編集2020/01/27 10:13

【移動前】
移動前
【移動後の理想】
イメージ説明
【移動後の現状】
イメージ説明

左側に750分スライドするアニメーションなのですが、
線形移動のはずなのにフレームの半分の高さ分667分下にに下がります。
Y座標は同じまま0で設定してます。謎です

イメージ説明

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class TabBtn : MonoBehaviour 6{ 7 Animator animator; 8 Vector3 startPos = new Vector3(0,0,0); 9 Vector3 endPos = new Vector3(-750,0,0); 10 public GameObject wrapper; 11 bool testFlg = false; 12 float time = 1; 13 float sum = 0; 14 float wW = 375.0f; 15 16 // Start is called before the first frame update 17 void Start() 18 { 19 //GetComponentを用いてAnimatorコンポーネントを取り出す. 20 animator = GetComponent<Animator>(); 21 } 22 23 // Update is called once per frame 24 void Update() 25 { 26 if (!testFlg) 27 { 28 return; 29 } 30 sum += Time.deltaTime; 31 if (sum <= time) 32 { 33 var rate = sum / time; 34 Debug.Log(startPos); 35 Debug.Log(endPos); 36 Debug.Log(rate); 37 wrapper.transform.position = Vector3.Lerp(startPos, endPos, rate); 38 } else 39 { 40 sum = 0; 41 testFlg = false; 42 } 43 } 44 45 public void changeTab(bool flg) 46 { 47 48 int param = animator.GetInteger("Test"); 49 if (flg) 50 { 51 param = 1; 52 testFlg = true; 53 } 54 else 55 { 56 param = 2; 57 } 58 59 animator.SetInteger("Test", param); 60 } 61} 62

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

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

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

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

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

sakura_hana

2020/01/28 01:40

transform.positionとuGUI(Canvas上)の位置はイコールではありません。 「uGUI スクリプト 移動」などで調べてみてください。
nakamu

2020/01/29 21:11

ありがとうございます。 localpositionでスライドできましたが、 なぜか今度はGUI側のアンカーがきいてないのか開始位置が右に375分ずれて終了位置が左に-375分ずれてしまいます。 GetComponent<RectTransform>からanchoredPositionをコードで再度 new Vector2(0, 0.5)と設定しましたがずれたままです
sakura_hana

2020/01/30 01:03

状況がよくわかりませんが最初からanchoredPositionのみで制御すればいいのではないでしょうか? (localpositionはオブジェクトの原点が基準なんでuGUIのアンカーは効きません)
nakamu

2020/01/30 03:42

>(localpositionはオブジェクトの原点が基準なんでuGUIのアンカーは効きません) localpositionは必ずAnchor Presetsのcenter & middleを基準に動くという理解でよろしいですか?
nakamu

2020/01/30 04:21

localpositionだと親の中心が原点となるんですね anchoredPositionを誤解しておりました。 動かしたいUIの中心を原点とするのがanchoredPositionなんですね。 なのでsakura_hanaさんのおっしゃる通りanchoredPositionのみの制御 anchoredPosition = Vector2.Lerp(startPos, endPos, rate); でうまくいきました ありがとうございます!!
sakura_hana

2020/01/30 04:42

そうです、positionとlocalpositionは3Dモデルと同様に親(positionの場合はワールド)の中心が原点になります。 anchoredPositionはその名前の通り、Anchorで設定した値が基準となります。(なのでAnchorを変えればUIの中央だけでなく、端を基準にすることも出来ます) ひとまず解決して何よりです。自己解決として回答投稿をお願いします。
guest

回答1

0

自己解決

RectTransformについて
動かしたいUIの中心を原点とするanchoredPositionを使ってうまくいきました。

C#

1// Update is called once per frame 2 void Update() 3 { 4 if (!testFlg) 5 { 6 return; 7 } 8 sum += Time.deltaTime; 9 var rectTransform = wrapper.GetComponent<RectTransform>(); 10 if (sum <= time) 11 { 12 var rate = sum / time; 13 Debug.Log(startPos); 14 Debug.Log(endPos); 15 Debug.Log(rate); 16 rectTransform.anchoredPosition = Vector2.Lerp(startPos, endPos, rate); 17 } else 18 { 19 sum = 0; 20 testFlg = false; 21 rectTransform.anchoredPosition= new Vector2(-750, 0); 22 } 23 } 24

投稿2020/01/30 04:48

nakamu

総合スコア82

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問