UnityのBooの注意点
UnityはPythonモドキのBooが使えます。みんなと違うことマイナーなことが好きなのでBooを使って日本人で唯一のUnityでBooプログラマになりたい。
Pygame本を翻訳してこのBlogに辿り着いたのにPygameはおろかPythonも書いておらずほぼUnityネタだけになってるのでせめてBoo書かないといけない。
JSよりいいことは行数が削減できるのと、Tabとの混合を避けられること。インデントを強制できる!
半角スペース4つが好き。
◯JavaScriptから移植の注意点
・floatがない?
def CalculateJumpVerticalSpeed (targetJumpHeight as single): # From the jump height and gravity we deduce the upwards speed # for the character to reach at the apex. return Mathf.Sqrt(2 * targetJumpHeight*1.0 * gravity)
↑引数targetJumpHeightがfloatだったがBooではsingle
・アイコンが変
Projectにパックマンのゴーストみたいなアイコンです。.jsとかつかない。
・拡張子はpyでなくboo
Pythonモドキなので.booです。
・C#と同様に@scriptではなくて[]でかこむ
[RequireComponent(CharacterController)]
・public変数は任意ではなく必須
var walkSpeed = 2.0;
JSではこれでもインスペクタに変数表示ができたが、
public walkSpeed = 2.0
Pythonは明示的にpublicを記載する必要がある
・クラスは必要
class ThirdPersonController(MonoBehaviour):
・if文のカッコは要らない、でも:は要る。
if IsGrounded():
・否定は!でなくnot
if not runAnimation:
・else ifではなくてelif
if not runAnimation:
・行の最後の「;」が要らない
Input.ResetInputAxes()
・メソッドの後にも:が必要、ついでにdef(Pythonと同じ)
def Update ():
・floatとかvarはいらん
walkSpeed = 2.0
→float代わりにsingleでもいい
・スペースとタブをインデントに混ぜて使えない
BCE0043: Unexpected token:
・一行コメントは#も//もOK
# ANIMATION sector
// Set rotation to the move direction
・複数行は'''と'''で挟むのでなく、JSと同じく/* */
''' Apply gravity - extra power jump modifies gravity - controlledDescent mode modifies gravity '''
↑だめ
・メソッドに何か処理書くときはpassは消す
def Start (): pass
↑これは処理がないのでpassで大丈夫だが
def Start (): hoge + bar pass
こんなのはダメ
・型は:でなくasで指定
private _characterState as CharacterState
・float型はsingleにするか記載しない
def CalculateJumpVerticalSpeed (targetJumpHeight as float):
↑これはだめ
def CalculateJumpVerticalSpeed (targetJumpHeight):
↑
as floatはいらない。または、singleにする。
・「||」は「or」で。「&&」は「and」
if moveSpeed < walkSpeed * 0.9 and grounded:
※ただし|はそのまま
・enumはメソッドっぽく書いて、それぞれの値はintとして使用する?
enum CharacterState:
Idle = 0
Walking = 1
Trotting = 2
Running = 3
Jumping = 4
MonoBehaviour.OnCollisionEnter MonoBehaviour.OnTrigger Unity
自身にrigidbodyまたはcolliderぶつかる相手もrigidbodyまたはcollider
Colliderコンポーネントある"Is Trigger"のスイッチをONにする。
Colliderコンポーネント自身もチェック入れないといけないみたい
Animation系わからないことメモ Unity
animation["punch"].speed = punchSpeed;
これは速度というより"倍速"。1なら1倍速で再生する。
animation["Punch"].layer = 2;
"大きい方"が"優先"されて上書き再生される。
layer(レイヤー)が同じ数字で2つのアニメ再生だと、2番目に再生したアニメーションが終わったら停止したままになる。
layer1→layer2→layer2の最後のコマで停止
layer1のアニメーション後に、layer2のアニメ再生であれば
layer1→layer2→layer1になる
var v = Input.GetAxisRaw("Vertical");
横向き方向の入力、-1([←]キー)〜1([→]キー) でfloat型の数値。0はニュートラル。
var h = Input.GetAxisRaw("Horizontal");
縦向き方向の入力、-1([↓]キー)〜1([↑]キー)でfloat型の数値。0はニュートラル。
※これらはコントローラの力で0.5とかになったりする。
PlayやCrossFadeはアニメーション中(in over a period of)に再生する。
〜〜Queued系は前のアニメーションを”待って”から再生する!
animation.CrossFadeQueued("アニメーション名", フェード長, 再生待ち設定);
※queued・・・待ち行列に入れられた、待ち行列型の
・3番目の引数「再生待ち設定」
2 種類(QueueModeは最初から用意されているクラスなので意識しなくていい)
QueueMode.CompleteOthers:現在再生中のアニメーションの終了を待って再生
QueueMode.PlayNow:即座に再生
現在再生中のアニメーションが終了してから、今回のアニメーションをクロスフェード再生する。
クロスフェード再生・・・ユーザが指定した"秒数に合わせて"前の曲をフェードアウトし、同時に次の曲をフェードインする機能
→今回は曲でなくアニメーションなので、前のアニメーションのフェードアウト期間を指定する?
animation.CrossFadeQueued("アニメーション名").speed = 2.0;
↑このようにしないとspeedは変更できない
animation.speed = 2.0;
↑これはダメダメ
animation.PlayQueued("shoot", QueueMode.PlayNow);
animation.CrossFade("Idle");
1回再生されるアニメーションの場合CrossFadeを使用
Playの代わりにCrossFadeを使うと、アニメーションの切り替えが滑らかになる。
ピンポン再生・・順再生、逆再生を行う
あとで調べる
animation.Blend("アニメーション名", ターゲットウェイト値, フェード長);
1.0 に変更しています。
※ループ再生されるアニメーションの場合Blendを基本的に使用
animation["run"].wrapMode = WrapMode.Loop; // animation["run"].wrapMode = WrapMode.Once; だと「dt >= 0」って不明なエラーが出る animation.Blend("run", 1.0, 0.3);
・weight(ウェイト) ※wait(待ち時間)とかではない
合成率を示す
1 ・・・見た目上で再生
0・・・アニメーションは再生されない
1.0が100%、よって0.5は50%
CrossFadeとBlendは違う?
function DidPunch () {
animation.CrossFadeQueued("punch", 0.1, QueueMode.PlayNow);
}
@script RequireComponent(AudioSource)
audio.PlayOneShot(punchSound);
|