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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

483閲覧

Unityで頂点を散らばしたものをゆっくり元の形に戻す方法

tensaikumabouzu

総合スコア45

C#

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

Unity3D

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

Unity

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

0グッド

1クリップ

投稿2018/06/16 10:54

以下がオブジェクトにアタッチするスクリプトです。
開始と同時に点となって散らばってるんですが、
Invoke()関数を使って10秒後に戻そうと思ってるのですが、
散らばったままで動きません。どこが間違ってるのでしょう。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class PointBack : MonoBehaviour { MeshFilter MF; Vector3[] PreVertices; Mesh mesh; public float speed = 0.15f; public bool ok = false; public Vector3[] ver; //初期の頂点情報を記録 void Awake(){ mesh = GetComponent<MeshFilter> ().mesh; PreVertices = mesh.vertices; } void Start () { //頂点を表示 MF = GetComponent<MeshFilter>(); MF.mesh.SetIndices(MF.mesh.GetIndices(0),MeshTopology.Points,0); //開始時点で頂点を散らす Vector3[] ver = mesh.vertices; for (int i = 0; i < ver.Length; i++) { ver [i].x += speed * Random.Range (-50f, 50f) * Time.deltaTime; ver [i].y += speed * Random.Range (-50f, 50f) * Time.deltaTime; ver [i].z += speed * Random.Range (-50f, 50f) * Time.deltaTime; } mesh.vertices = ver; //〇秒後に元の時計の形に戻す Invoke("PreDisplay", 10f); } float smoothTime = 0.5f; Vector3 velocity = Vector3.zero; // Update is called once per frame void Update () { if (ok) { //ターゲットは元の位置 Vector3[] target = PreVertices; ///Vector3[] ver2 = mesh.vertices; for (int i = 0; i < target.Length; i++) { ver[i] = Vector3.SmoothDamp (transform.position, target [i], ref velocity, smoothTime); } mesh.vertices = ver; mesh.RecalculateBounds (); } } void PreDisplay(){ ok = true; } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

SmoothDampの使い方がちょっと妙なように思えます。

個々の頂点をそれぞれなめらかに本来の位置へ向かわせたいのですから、SmoothDampに渡すcurrenttargetcurrentVelocityもそれぞれの頂点固有のものを使うべきですが、現在のコードではcurrentVelocityが全頂点で一つのVector3 velocityを共有してしまっており、またcurrentはなぜかtransform.positionを使っています。

SmoothDampに渡す引数をこんな感じに変更してみるとどうでしょうか?

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PointBack : MonoBehaviour 6{ 7 8 MeshFilter MF; 9 Vector3[] PreVertices; 10 Mesh mesh; 11 12 public float speed = 0.15f; 13 public bool ok = false; 14 public Vector3[] ver; 15 Vector3[] velocities; // velocityをVector3配列velocitiesに変更...個々の頂点の速度をそれぞれ保管できるようにする 16 17 //初期の頂点情報を記録 18 void Awake() 19 { 20 mesh = GetComponent<MeshFilter>().mesh; 21 PreVertices = mesh.vertices; 22 velocities = new Vector3[PreVertices.Length]; // 速度保管用配列を確保 23 } 24 25 void Start() 26 { 27 //頂点を表示 28 MF = GetComponent<MeshFilter>(); 29 MF.mesh.SetIndices(MF.mesh.GetIndices(0), MeshTopology.Points, 0); 30 //開始時点で頂点を散らす 31 ver = mesh.vertices; // verはローカル変数ではなくインスタンスフィールドの方を使う 32 for (int i = 0; i < ver.Length; i++) 33 { 34 ver[i].x += speed * Random.Range(-50f, 50f) * Time.deltaTime; 35 ver[i].y += speed * Random.Range(-50f, 50f) * Time.deltaTime; 36 ver[i].z += speed * Random.Range(-50f, 50f) * Time.deltaTime; 37 } 38 mesh.vertices = ver; 39 //〇秒後に元の時計の形に戻す 40 Invoke("PreDisplay", 10f); 41 } 42 43 float smoothTime = 0.5f; 44 // Vector3 velocity = Vector3.zero; // velocityはvelocitiesに置き換える 45 46 // Update is called once per frame 47 void Update() 48 { 49 if (ok) 50 { 51 //ターゲットは元の位置 52 Vector3[] target = PreVertices; 53 ///Vector3[] ver2 = mesh.vertices; 54 for (int i = 0; i < target.Length; i++) 55 { 56 // 現在位置はtransform.positionではなくver[i]を使うのが適切と思われる 57 // また、現在速度も頂点ごとに個別に更新させる 58 ver[i] = Vector3.SmoothDamp(ver[i], target[i], ref velocities[i], smoothTime); 59 } 60 mesh.vertices = ver; 61 mesh.RecalculateBounds(); 62 } 63 } 64 65 void PreDisplay() 66 { 67 ok = true; 68 } 69 70}

投稿2018/06/16 19:54

Bongo

総合スコア10807

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

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

tensaikumabouzu

2018/06/18 05:23

ありがとうございます。 mesh.RecalculateBounds (); も書き忘れていたようです。 大変参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問