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

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

ただいまの
回答率

90.84%

  • C#

    6290questions

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

Unityのコードについての質問

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 203

hanako1025

score 1

前提・実現したいこと  

GAに興味を持ち、こちらの下部で配布されているソースコードを拝見したのですが、足がどのような動きになるのか分からず行き詰まっています。  
どなたかご教授いただけないでしょうか?

該当のソースコード

using UnityEngine;
using System.Collections;

public class LegRotator : MonoBehaviour {

    //public int targetCount = 3;
    //public Vector3[] targetRot;

    public LegParam Param { get; set; }

    public float loopCount = 2.0f;
    protected float count;

    protected float sleepTime;

    // Use this for initialization
    void Start () {

        //this.rigidbody.maxAngularVelocity = 10;
        //this.rigidbody.mass = Param.mass;

        sleepTime = 1.0f;
    }

    // Update is called once per frame
    void FixedUpdate () {

        if( sleepTime > 0.0f ) {
            sleepTime -= Time.fixedDeltaTime;
            return;
        }

        count += Time.fixedDeltaTime;
        if( count >= loopCount ) count -= loopCount;

        float sc = (count / loopCount) * Param.targetCount;

        int lid = Mathf.FloorToInt(sc);
        float lr = sc - lid;

        int nid = (lid >= Param.targetCount-1) ? 0 : lid + 1;
        float rr = Mathf.Cos(lr * Mathf.PI) * 0.5f + 0.5f;


        Vector3 tr1 = Param.targetRot[lid];
        Vector3 tr2 = Param.targetRot[nid];
        Vector3 cr = tr1 * rr + tr2 * (1.0f - rr);

        //float rr = Mathf.Cos(r * Mathf.PI) * 0.5f + 0.5f;
        //float crx = rx1 * rr + rx2 * (1.0f - rr);
        //float crz = rz1 * rr + rz2 * (1.0f - rr);

        Quaternion q = Quaternion.Euler(cr);
        this.transform.localRotation = q;

        //this.rigidbody.angularVelocity = cr * Time.fixedDeltaTime * 200;
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+2

プロジェクト全体をしっかり見たわけではないですが、私の解釈だと下記のような感じです。
コメントアウトされていたコードは、見やすくするため省略しました。
変数名は多分何かの省略語だと思うのですが、何を表すのかちょっとイメージしづらかったですね...

    void FixedUpdate ()
    {
        // 世代開始後1秒間は何もせず待機
        if (sleepTime > 0.0f) {
            sleepTime -= Time.fixedDeltaTime;
            return;
        }

        // ウォーカーの脚は4本、各脚は上部下部から構成されている
        // この8つの脚セグメントにそれぞれLegRotatorがアタッチされている
        // Param内に1周期の脚モーション中の各時点で
        // この脚セグメントをどの向きに向けるかが記録されている

        // countが0秒〜2秒までを周期的に繰り返すようにする
        // 2秒間でこの脚セグメントが1周期のモーションを行う
        count += Time.fixedDeltaTime;
        if (count >= loopCount)
            count -= loopCount;

        // Param.targetCountは1周期中の脚セグメントの向きの数...「キーフレームの数」みたいなものと考えるといいかもしれません
        // scは現在のサイクル時間(0秒〜2秒)から求めたモーション位置(targetCountが4の場合0=<sc<4)...名前の由来は何なんでしょうか?
        float sc = (count / loopCount) * Param.targetCount;

        // lidはscの整数部分→向き補間のベースとなる向きのインデックス...名前の由来は「leg index」でしょうか
        int lid = Mathf.FloorToInt (sc);
        // lrはscの小数部分→ベースの向きと次の向きのブレンド比の算出に使う...名前の由来は「leg ratio」?
        float lr = sc - lid;

        // nidはlidの次、つまり次の向きのインデックス...名前の由来は「next index」でしょうか
        int nid = (lid >= Param.targetCount - 1) ? 0 : lid + 1;
        // lrにπを乗じコサインを得る→lrが0〜1に変化すると、コサインは1〜-1に変化する
        // コサインに0.5を乗じ0.5を足す→コサインが1〜-1に変化すると、rrは1〜0に変化する
        // このrrを「ベースの向き」と「次の向き」をブレンドする比率とする...名前の由来は「rotation ratio」?
        // rrは下図のようなカーブを描くはず
        //
        // rr
        // 1|***
        //  |   **
        //  |     *
        //  |      *
        //  |       *
        //  |        **
        //  |          ***
        // 0+-------------
        //  0             1 lr
        //
        float rr = Mathf.Cos (lr * Mathf.PI) * 0.5f + 0.5f;

        //「ベースの向き」と「次の向き」を比率rrでブレンド、結果をcrに格納...名前の由来は「current rotation」?
        Vector3 tr1 = Param.targetRot [lid];
        Vector3 tr2 = Param.targetRot [nid];
        Vector3 cr = tr1 * rr + tr2 * (1.0f - rr);

        // セグメントの向きをcrにする
        Quaternion q = Quaternion.Euler (cr);
        this.transform.localRotation = q;
    }

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/15 03:54

    丁寧な解説をありがとうございます。
    とてもわかり易く助かりました!

    キャンセル

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

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

関連した質問

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

  • C#

    6290questions

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