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

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

ただいまの
回答率

90.47%

  • Unity

    4199questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • アルゴリズム

    420questions

    アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Unity 波動のようなモーションを作りたい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 4,448

seri

score 386

↓画像のような波動を作りたいと思っています。
イメージ説明

Graphics.DrawMeshとfor文を使って大量のBoxMeshを描画した後、それぞれのBoxの位置とカメラの位置を使って波動のモーションにしたかったのですが上手くいきません。。

public Mesh mesh;
    public Material material;
    Vector3 nami1=new Vector3 (0,0,80f);

    Vector3 pos;
    public float tim;

    Vector3 vec=new Vector3(0,0,0);
    void Update(){
        int a = 0;
        int z = 0;
//ここでBoxをFor文で設置しています
        for (int i=0; i<10000;i++){
            vec=new Vector3(a*20-500,-300f,3100-z*2f);//この数はゲームシステムによるものなので、あまり気にしないでください。

            if (Input.GetMouseButtonDown (0)) {
                tim=Time.time;
                pos=Camera.main.transform.position;

            }
             //↓ここが問題です。。
            if(nami1.sqrMagnitude<(vec-pos).sqrMagnitude){
                vec.y-=(tim-Time.time)*(vec-pos).sqrMagnitude*0.0009f;
                if(vec.y<-300f){
                    vec.y=-300;
                }
            }
             //↓ここは単にBoxの数を決めているだけですので、あまり関係ありません
            a+=1;
            if(a==50){
                a=0;z+=10;
            }
            Graphics.DrawMesh(mesh,vec,Quaternion.identity, material,0);
        }


    }

追記:うまくいかないとは具体的にどのような事なのか記載してほしいとの意見をいただきました
やはり一番に気になるのは、モーションです。均等な間隔で、均等な動きでは、波のような少しずつ波が穏やかになる動きとはかけはなれてしまいます。
次に気になるのは、一度マウスクリック後に、またマウスクリックした場合リセットされることです

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • urahimono

    2016/05/22 18:57

    このコードの処理が上手くいかないとのことですが、どのように上手くいっていないのでしょうか。 波動のように見えない、波動が繰り返さないなど問題点の情報の追加をお願い致します。

    キャンセル

回答 1

0

波動のモーションが気になるということでしたら、力学を使った波の動きを参考にするのはいかがでしょうか。
以下のリンク先に波の動きのプログラムのサンプルがあります。
このサンプルは2次元ですが、動きの参考になるかもしれません。
力学アルゴリズムによる波のシミュレーション(線上の波)

上記のプログラムをUnityで使える形改良したものを下記に記述しておきます。
ご参考になればと思います。

using UnityEngine;

public class WaveTest : MonoBehaviour
{
    [SerializeField]
    private Mesh        mesh        = null;
    [SerializeField]
    private Material    material    = null;

    // 媒質の長さ
    [SerializeField]
    private float       LENGTH      = 20.0f;
    // 自由端かどうか
    [SerializeField]
    private bool        FREE_END    = false;
    // シミュレーションの時間刻み
    [SerializeField]
    private float       DT          = 0.2f;
    // 減衰力係数
    [SerializeField]
    private float       FRICTION    = 2.0f;
    // 張力
    [SerializeField]
    private float       TENSION     = 30.0f;


    // ラインの頂点数
    const int N = 128;

    // ラインの頂点の座標
    private Vector3[]   vertex  = new Vector3[N];

    // ラインの頂点の速度
    float[] vertexVY    = new float[N];

    // ラインの頂点に働く力
    float[] vertexFY    = new float[N];

    // 単位長さあたりの質量密度
    const float DENSITY = 100.0f;

    // 初期パルスの幅
    const float PULSE_WIDTH = 0.3f;

    // 初期パルスの高さ
    const float PULSE_HEIGHT = 1.0f;


    void Start()
    {
        // 頂点Xの初期値設定
        for( int i = 0; i < N; i++ )
        {
            float x = i * LENGTH / N;
            vertex[ i ].x   = x;
        }

        // 頂点Yの初期値設定(ガウス波束)
        float centerX = LENGTH / 2;
        for( int i = 0; i < N; i++ )
        {

            float x = i * LENGTH / N;

            // ガウス関数
            vertex[ i ].y   = PULSE_HEIGHT * Mathf.Exp( -( x - centerX ) * ( x - centerX ) / ( 2 * PULSE_WIDTH * PULSE_WIDTH ) );

            // 初期速度は 0(静止状態)
            vertexVY[ i ]   = 0.0f;
        }
    }


    void Update()
    {
        UserInput();


        // 質点間の距離
        float dx = LENGTH / N;

        // 質点1個あたりの質量
        float m = DENSITY * LENGTH / ( N + 1 );

        // 端以外の頂点にかかる力の計算
        for( int i = 1; i < N - 1; i++ )
        {

            vertexFY[ i ] =
                ( vertex[ i + 1 ].y + vertex[ i - 1 ].y - 2.0f * vertex[ i ].y ) * TENSION / dx
                - FRICTION * vertexVY[ i ];
        }

        // 両端にかかる力の計算
        if( FREE_END )
        { // 自由端

            // 隣接する1個の質点からのみ力を受ける
            vertexFY[ 0 ] =
                ( vertex[ 1 ].y - vertex[ 0 ].y ) * TENSION / dx - FRICTION * vertexVY[ 0 ];

            vertexFY[ N - 1 ] =
                ( vertex[ N - 2 ].y - vertex[ N - 1 ].y ) * TENSION / dx - FRICTION * vertexVY[ N - 1 ];

        }
        else
        { //固定端

            // 壁から固定する抗力を受けるので、合力は0で動かない
            vertexFY[ 0 ]       = 0.0f;
            vertexFY[ N - 1 ]   = 0.0f;
        }

        // 位置と速度の計算
        for( int i = 0; i < N; i++ )
        {

            // 頂点の速度変化の計算
            vertexVY[ i ] += vertexFY[ i ] / m * DT;

            // 頂点の座標変化の計算
            vertex[ i ].y += vertexVY[ i ] * DT;
        }

        foreach( var vec in vertex )
        {
            Graphics.DrawMesh( mesh, vec, Quaternion.identity, material, 0 );
        }
    }


    private void UserInput()
    {
        if( Input.GetMouseButtonDown( 0 ) )
        {
            vertexVY[ N / 2 ]   = -5.0f;
        }
    }

} // class WaveTest

イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Unity

    4199questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • アルゴリズム

    420questions

    アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。