万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

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);
|