万年素人からHackerへの道

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

  • ・資産運用おすすめ
    10万円は1000円くらい利益
    資産運用ブログ アセマネ
    • ・寄付お願いします
      YENTEN:YYzNPzdsZWqr5THWAdMrKDj7GT8ietDc2W
      BitZenny:ZfpUbVya8MWQkjjGJMjA7P9pPkqaLnwPWH
      c0ban:8KG95GXdEquNpPW8xJAJf7nn5kbimQ5wj1
      Skycoin:KMqcn7x8REwwzMHPi9fV9fbNwdofYAWKRo

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