【Unity】【C#】SmoothFollow を C# で書いてみる 
2015/02/04 Wed [edit]
色々サンプルみてると Standard Assets の「SmoothFollow.js」を使っていて、C# スクリプトから SmoothFollow をクラス名(型)でそのまま使っていたりするけど(SmoothFollow sf = ~みたいに)、なぜか今使っているバージョン(Unity4.6.1f1/MonoDevelop4.0.1)では JavaScript(UnityScript) で書かれたコードはクラス名(型)として使えないんだよね。Joystick.js なんかも入力候補に出てこない(手入力してもエラー。ルートに置いてもダメ)。インスト失敗したのかな…?まぁいいやと思って、試しに js をそのまま C# スクリプトに書き直してみたら、うまく行った。
●SmoothFollow.js の C# 版
using UnityEngine;
using System.Collections;
[AddComponentMenu("Camera-Control/SmoothFollow")]
public class SmoothFollow : MonoBehaviour {
/** 追従するオブジェクト */
public Transform target;
/** Z方向の距離 */
public float distance = 10.0f;
/** Y方向の高さ */
public float height = 5.0f;
/** 上下高さのスムーズ移動速度 */
public float heightDamping = 2.0f;
/** 左右回転のスムーズ移動速度 */
public float rotationDamping = 3.0f;
void LateUpdate() {
if (target == null) {
return;
}
//追従先位置
float wantedRotationAngle = target.eulerAngles.y;
float wantedHeight = target.position.y + height;
//現在位置
float currentRotationAngle = transform.eulerAngles.y;
float currentHeight = transform.position.y;
//追従先へのスムーズ移動距離(方向)
currentRotationAngle = Mathf.LerpAngle(currentRotationAngle, wantedRotationAngle,
rotationDamping * Time.deltaTime);
currentHeight = Mathf.Lerp(currentHeight, wantedHeight, heightDamping * Time.deltaTime);
//カメラの移動
var currentRotation = Quaternion.Euler(0, currentRotationAngle, 0);
Vector3 pos = target.position - currentRotation * Vector3.forward * distance;
pos.y = currentHeight;
transform.position = pos;
transform.LookAt(target);
}
}
書いた後で気がついたんだけど、英語のフォーラムの方に js→C# の自動変換をしてバグったという質問に、修正版が書かれてあったけど、ほぼ同じだった。まぁ、日本語でコメント書いてあるから日本人向けということで(笑)。
自動変換でバグる理由は js で transform.position.y = currentHeight; となっている部分をそのまま C# で書くと、テンポラリな値になってしまって、無効になってしまうからなんだよね。Java なんかもこういう書き方するから、私も最初間違えた。「あれ?なんか警告出てるな」って思って修正したので、すぐ上手く動いたけどね。自動変換ツールっていうのも微妙なんだな…。私は勉強にもなるし、手と頭で変換するからツールは使ったことないけど。
(関連記事)
【Unity】【C#】SmoothFollow に回転アングルと距離の遠近機能を付けてみる
- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/162-17aeabf1
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |