うにばな です。 はじめての方は『うにばな』とはなんぞ と思われるかもですが
Unityのはなし でうにばなです。
少し変わった名前をつけたほうが検索エンジンで上位に来やすいのでひっかかりやすい のと
だれかに教えるときに うにばなっていうのがあってね っていうサイトを見てもらうきっかけになり易い
それと 一番大きいのが、Unityの話に興味のないフォロワーさんが うにばな だから今日の更新は見なくていいや という判断をしてもらうためにつけました。 まあたいした理由じゃないです。
今週サーチエンジンの検索が多かった順でスクリプト関連のお話しをします
■一回だけ実行
時々こういう操作を行う場面があります 例えばStart()関数のあとに初期化を行いたい場合などですが
例えばUpdate()関数内などで一度だけ初期化の処理を実行したい場合は 何かフラグを作ることで一度だけ処理を行うようにします
例)
var Flag:boolean=false;
function Update(){
if(!Flag){
実行文
Flag=true;
}
}
Flagがtrue状態の時にはif文内を実行することはないので一度だけif文を実行することになります。
ブーリアン型のフラグを使って実行を制御する方法でわたしがよく使用するのが
以前にもお話ししましたが
例)
var Flag:boolean=false;
function Update(){
if(!Flag) func();
}
function func(){
Flag=true;
実行文
yield WaitForSeconds(2.0); // 無くても良いです
Flag=false;
}
これはUpdate()が毎フレームfunc()関数をコールしてしまうためfunc()関数がフレーム単位で最初から実行されてしまうのを
避けるためにフラグを立ててfunc()の実行が終わるまで待たせるための処理です。
でこれも以前に書きましたが、これをスマートにした形で
例)
function Start(){
Loop();
}
function Loop(){
while(true){
yield func();
}
}
function func(){
実行文
yield WaitForSeconds(2.0); // 無くても良いです
}
while(true)は無限ループの指定ですのでLoop()はUpdate()と同じような動作をしますが
Update()関数内部ではyield(フレームを遅延させるための命令)が書けないため
あえてループのための関数を定義して実行文のあるfunc()関数をコールしています。
という感じでフラグを上手く使うことで実行の流れを制御できることがお分かりいただけたでしょうか
ただしUnityエンジンのV3.5からスクリプトの実行順の制御ができるようになるそうですので
3.4で対応済みでした Edit>Project Setting>Script Execution Order で実行順を制御することができます。
これらにあまり頭を悩ませる必要はなくなるのかもしれません。
■GUITextureのソート
GUITextureのtransform.position.z の値 つまりz軸の値で手前か奥かを制御できます
■オブジェクトの非表示
初めてUnityに触ったときはそうとう探しまくりましたが なかなか見つからないんですよね
MeshFilterをオフにする か マテリアルを透明にするなど言うことも可能ですが
LODの解説の回でお話しした gameObject.SetActiveRecursively(true); trueのところをfalseにすると非表示になります。
子供のオブジェクトまで非表示にしてくれるのでとても使いやすいです。
メッシュレンダラーを直接 renderer.enabled = false; としてもモデルを非表示にすることはできますが
そのモデル単体を非表示にすることしか出来ず セットアップしたモデルを非表示にする場合などは
子になっているオブジェクトまですべて指定しなければなりませんので非常に面倒です。
■カメラがキャラクターを追尾
”SmoothFollow”などのカメラ制御スクリプトがあると思いますのでそちらを参考にしていただいたほうがいいですね
http://www.unifycommunity.com/wiki/index.php?title=SmoothFollow2
"JavaScript - SmoothFollow2.js"
var target : Transform;
var distance = 3.0;
var height = 3.0;
var damping = 5.0;
var smoothRotation = true;
var rotationDamping = 10.0;
function Update () {
var wantedPosition = target.TransformPoint(0, height, -distance);
transform.position = Vector3.Lerp (transform.position, wantedPosition, Time.deltaTime * damping);
if (smoothRotation) {
var wantedRotation = Quaternion.LookRotation(target.position - transform.position, target.up);
transform.rotation = Quaternion.Slerp (transform.rotation, wantedRotation, Time.deltaTime * rotationDamping);
}
else transform.LookAt (target, target.up);
}
これをカメラにアサインすればtargetを追従するように動作してくれます。
説明すると targetがTransform型でInspector上ではカメラが追従する対象となるモデルをアサインします。
target.TransformPoint(0, height, -distance)で targetからheight分の高さでdistance分の距離をマイナスした座標を求めます。
transform.position = Vector3.Lerp (transform.position, wantedPosition, Time.deltaTime * damping);
4回目の講座みたいなものでやりましたLerp()関数を使って求めた座標までカメラを移動させます dampingが大きいほど移動に時間がかかります。
if()文はsmoothRotationのフラグが立っていたら Quaternion.Slerp()を使用してtargetまでのカメラの回転を行います。
transform.LookAt()はtargetのほうを向けることができますが移動時間の制御ができないためゆったりとした回転を与えるためにQuaternion.Slerp()
の時間変数にTime.deltaTime * rotationDampingを代入しているものです。
と 今回は分かっている人には物足りない記事だったかも知れませんが、はじめたての人には引っかかる部分だと思い記事にしました。
講座みたいなものは できれば次回やります。 もうみなさん学習が進んで必要ないかも知れませんがw
Unityのはなし でうにばなです。
少し変わった名前をつけたほうが検索エンジンで上位に来やすいのでひっかかりやすい のと
だれかに教えるときに うにばなっていうのがあってね っていうサイトを見てもらうきっかけになり易い
それと 一番大きいのが、Unityの話に興味のないフォロワーさんが うにばな だから今日の更新は見なくていいや という判断をしてもらうためにつけました。 まあたいした理由じゃないです。
今週サーチエンジンの検索が多かった順でスクリプト関連のお話しをします
■一回だけ実行
時々こういう操作を行う場面があります 例えばStart()関数のあとに初期化を行いたい場合などですが
例えばUpdate()関数内などで一度だけ初期化の処理を実行したい場合は 何かフラグを作ることで一度だけ処理を行うようにします
例)
var Flag:boolean=false;
function Update(){
if(!Flag){
実行文
Flag=true;
}
}
Flagがtrue状態の時にはif文内を実行することはないので一度だけif文を実行することになります。
ブーリアン型のフラグを使って実行を制御する方法でわたしがよく使用するのが
以前にもお話ししましたが
例)
var Flag:boolean=false;
function Update(){
if(!Flag) func();
}
function func(){
Flag=true;
実行文
yield WaitForSeconds(2.0); // 無くても良いです
Flag=false;
}
これはUpdate()が毎フレームfunc()関数をコールしてしまうためfunc()関数がフレーム単位で最初から実行されてしまうのを
避けるためにフラグを立ててfunc()の実行が終わるまで待たせるための処理です。
でこれも以前に書きましたが、これをスマートにした形で
例)
function Start(){
Loop();
}
function Loop(){
while(true){
yield func();
}
}
function func(){
実行文
yield WaitForSeconds(2.0); // 無くても良いです
}
while(true)は無限ループの指定ですのでLoop()はUpdate()と同じような動作をしますが
Update()関数内部ではyield(フレームを遅延させるための命令)が書けないため
あえてループのための関数を定義して実行文のあるfunc()関数をコールしています。
という感じでフラグを上手く使うことで実行の流れを制御できることがお分かりいただけたでしょうか
3.4で対応済みでした Edit>Project Setting>Script Execution Order で実行順を制御することができます。
これらにあまり頭を悩ませる必要はなくなるのかもしれません。
■GUITextureのソート
GUITextureのtransform.position.z の値 つまりz軸の値で手前か奥かを制御できます
■オブジェクトの非表示
初めてUnityに触ったときはそうとう探しまくりましたが なかなか見つからないんですよね
MeshFilterをオフにする か マテリアルを透明にするなど言うことも可能ですが
LODの解説の回でお話しした gameObject.SetActiveRecursively(true); trueのところをfalseにすると非表示になります。
子供のオブジェクトまで非表示にしてくれるのでとても使いやすいです。
メッシュレンダラーを直接 renderer.enabled = false; としてもモデルを非表示にすることはできますが
そのモデル単体を非表示にすることしか出来ず セットアップしたモデルを非表示にする場合などは
子になっているオブジェクトまですべて指定しなければなりませんので非常に面倒です。
■カメラがキャラクターを追尾
”SmoothFollow”などのカメラ制御スクリプトがあると思いますのでそちらを参考にしていただいたほうがいいですね
http://www.unifycommunity.com/wiki/index.php?title=SmoothFollow2
"JavaScript - SmoothFollow2.js"
var target : Transform;
var distance = 3.0;
var height = 3.0;
var damping = 5.0;
var smoothRotation = true;
var rotationDamping = 10.0;
function Update () {
var wantedPosition = target.TransformPoint(0, height, -distance);
transform.position = Vector3.Lerp (transform.position, wantedPosition, Time.deltaTime * damping);
if (smoothRotation) {
var wantedRotation = Quaternion.LookRotation(target.position - transform.position, target.up);
transform.rotation = Quaternion.Slerp (transform.rotation, wantedRotation, Time.deltaTime * rotationDamping);
}
else transform.LookAt (target, target.up);
}
これをカメラにアサインすればtargetを追従するように動作してくれます。
説明すると targetがTransform型でInspector上ではカメラが追従する対象となるモデルをアサインします。
target.TransformPoint(0, height, -distance)で targetからheight分の高さでdistance分の距離をマイナスした座標を求めます。
transform.position = Vector3.Lerp (transform.position, wantedPosition, Time.deltaTime * damping);
4回目の講座みたいなものでやりましたLerp()関数を使って求めた座標までカメラを移動させます dampingが大きいほど移動に時間がかかります。
if()文はsmoothRotationのフラグが立っていたら Quaternion.Slerp()を使用してtargetまでのカメラの回転を行います。
transform.LookAt()はtargetのほうを向けることができますが移動時間の制御ができないためゆったりとした回転を与えるためにQuaternion.Slerp()
の時間変数にTime.deltaTime * rotationDampingを代入しているものです。
と 今回は分かっている人には物足りない記事だったかも知れませんが、はじめたての人には引っかかる部分だと思い記事にしました。
講座みたいなものは できれば次回やります。 もうみなさん学習が進んで必要ないかも知れませんがw