入力延滞


入力延滞ver0.2

下と同じ動作でコードが違うだけです

using UnityEngine;
using System.Collections;

public class GridPlayer_Learning : MonoBehaviour
{

  // Use this for initialization
   void Start ()
   {
   
   }
   
   Vector3 input;
   
   // Update is called once per frame
   void Update ()
   {
       input = GetDirect ();
   }
   
   float inputTimer;
   const float THRESHOLD = 0.3f;
   const float CONTINUATION = 2.0f;
   Vector3 preInput;
   
   //4方向レバー 無入力時2秒延滞 
   Vector3 GetDirect ()
   {
       inputTimer += Time.deltaTime;
       Vector3 input = new Vector3 (Input.GetAxis ("Horizontal"), 0.0f, Input.GetAxis ("Vertical"));
       float absX = Mathf.Abs (input.x); 
       float absZ = Mathf.Abs (input.z); 
       
       if (absX < THRESHOLD && absZ < THRESHOLD) {
           if (inputTimer < CONTINUATION) {
               return preInput;
           }
           return Vector3.zero;
       }

      inputTimer = 0;
       if (absX < absZ) {
           input.x = 0.0f;
       } else {
           input.z = 0.0f;
       }
       
       input = input.normalized;
       preInput = input;
       return input;
   }
   
   
}


入力延滞ver0.1

「遅延」ではなく「延滞」
つまり入力があれば即座に内容は更新されるが、入力が無くなった場合は、
以前に入力された値を指定された秒数継続させ延滞を表現する処理

using UnityEngine;
using System.Collections;

public class InputTest : MonoBehaviour {

  // Use this for initialization
   void Start () {
   
   }
   
   const float THRESHOLD = 0.2f;
   Vector3 lastInput;
   float lastTime;
   
   Vector3 tes;
   
   // Update is called once per frame
   void Update () {
       lastTime += Time.deltaTime;
       tes = GetDirection();
   }
   
   Vector3 GetDirection(){
       
       float x = Input.GetAxis("Horizontal");
       float z = Input.GetAxis("Vertical");
       float absX = Mathf.Abs(x);
       float absZ = Mathf.Abs(z);
       
       if(absX < THRESHOLD && absZ < THRESHOLD){    //入力無しが真 
           if(lastTime < 2.0f){
               x = lastInput.x;
               z = lastInput.z;
               absX  = Mathf.Abs(x);
               absZ  = Mathf.Abs(z);
           }
       }else{
           lastTime = 0;        //こちらでは冒頭の値がそのまま残っている点に留意 
           lastInput.x = x;
           lastInput.z = z;
       }
       
       if(absX < THRESHOLD && absZ < THRESHOLD){    //更新された値を再度検証し入力無しと判断すれば0を返す 
           return Vector3.zero;
       }
       
       
       Vector3 ret;
       
       //デジタル四方向レバーのエミュレート(斜めは無い) 
       if(absX < absZ){
           ret = new Vector3(0,0,z).normalized;    //(0,0,0.2f)をノーマライズすると(0,0,1)になる事に注目 
       }else{
           ret = new Vector3(x,0,0).normalized;
       }
       
       return ret;
   }
}

要件定義

  • 入力は即座に反映される
  • 縦横軸0.2以下の入力はあそびとして無視される
  • 常に2.0秒間入力は延長される
  • 4方向デジタルレバーを擬似的に再現し上下左右どれか一つの入力に絞る
  • 最期にvector3を返す。デジタルレバーの為、値は0か1にする

メニュー



  • 最終更新:2014-06-13 11:59:27

このWIKIを編集するにはパスワード入力が必要です

認証パスワード