見出し画像

【Unity】【ゲーム開発】【Tips】自動でスイングさせるミニ汎用スクリプト

ゲーム開発をしてる時に、「ちょっとOBJECTに動きを付けたい」時がある。こういう時に汎用で使える小さなスクリプトを作って纏めておき、上記のような時にポチッと付け足せるようにしておくと便利である。

例えば、付けたObjectを自動でスイングさせるスクリプト【AutoSwing.sc】

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AutoSwing : MonoBehaviour
{
   public bool m_XFlag = false;
   public bool m_YFlag = true;
   public bool m_ZFlag = false;
   public float m_Srx = 0.0f;
   public float m_Sry = 135.0f;
   public float m_Srz = 0.0f;
   public float m_Erx = 0.0f;
   public float m_Ery = 225.0f;
   public float m_Erz = 0.0f;
   public float m_Time = 0.0f;
   public float m_MaxTime = 3.0f;

   bool fFlip = true;

   Vector3 sRot;

   // Start is called before the first frame update
   void Start()
   {
       sRot = transform.eulerAngles;
   }

   // Update is called once per frame
   void Update()
   {
       
   }

   private void FixedUpdate()
   {
       Vector3 vec = sRot;

       if (m_XFlag)
       {
           if (fFlip)
           {
               vec.x = KajyuuHeikin(m_Srx, m_MaxTime - m_Time, m_Erx, m_Time);
           }
           else
           {
               vec.x = KajyuuHeikin(m_Erx, m_MaxTime - m_Time, m_Srx, m_Time);
           }
       }
       if (m_YFlag)
       {
           if (fFlip)
           {
               vec.y = KajyuuHeikin(m_Sry, m_MaxTime - m_Time, m_Ery, m_Time);
           }
           else
           {
               vec.y = KajyuuHeikin(m_Ery, m_MaxTime - m_Time, m_Sry, m_Time);
           }
       }
       if (m_ZFlag)
       {
           if (fFlip)
           {
               vec.z = KajyuuHeikin(m_Srz, m_MaxTime - m_Time, m_Erz, m_Time);
           }
           else
           {
               vec.z = KajyuuHeikin(m_Erz, m_MaxTime - m_Time, m_Srz, m_Time);
           }
       }
       transform.localRotation = Quaternion.Euler(vec.x, vec.y, vec.z);

       m_Time += Time.fixedDeltaTime;
       if (m_Time >= m_MaxTime)
       {
           m_Time = 0.0f;
           fFlip = !fFlip;
       }
   }

   //加重平均
   private float KajyuuHeikin(float sx, float n, float ex, float m)
   {
       if ((n + m) == 0.0f)
       {
           return 0.0f;
       }
       return (sx * n + ex * m) / (n + m);
   }
}

※XFlag,YFlag,ZFlag:揺らす座標系にチェック
※Srx,Sry,Srz:スイング開始角度(度数)
※Erx,Ery,Erz:スイング終了角度(度数)
※Time:時間
※MaxTime:スイング片道に要する時間

「専用のスクリプトを作るまではしたくないが、ちょっと動きをさせたい」、「本作成前に仮に動かして様子をみたい」時などに、これらのスクリプトをポチッとOBJに放り込めばいい。

例えば以下の置いただけの砲台に【AutoSwing.sc】を放り込むと

画像1

のようにちょっと警戒されてる感じになる。

ゲーム中だとゲッツゲッツゲッツカー2号の右手に攻撃手段が無くて暇そうなので、かわいそうなので振ってあげた。

画像2

気楽に動きを付けられるので、汎用的に狙いの動きをする小スクリプトを作って置くと開発はやりやすい。

以降の記事で自分が使ってる汎用スクリプトを晒しますので、自作するのが面倒な方は勝手にコピーして使ってくだされ。

以降の記事にAutoDestroyやAutoFirstScrollなども追加していきます。

この記事が気に入ったらサポートをしてみませんか?