Unityのコードについての質問
- 評価
- クリップ 1
- VIEW 144
前提・実現したいこと
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
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;
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 91.06%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/01/15 03:54
とてもわかり易く助かりました!