2017-04-04 16 views
0

私はunity2dでポケモンゲームを作ろうとしています。私はグリッドを動かすことができますが、移動することなく方向にどのように直面するか(A、WまたはSまたはDが移動せずに方向を向いている場合と同じ場所に留まる)の手掛かりはありません。私がこれまで持っているものだユニティ2D:移動しない向きの向き

[SerializeField] 
float walkingVelocity = 2; 
[SerializeField] 
float runingVelocity = 4; 

Vector3 p;        // For movement 
Animator anim; 

Vector2 input; 
float actualSpeed = 0; 

void Start() 
{ 
    anim = GetComponent<Animator>(); 
    p = transform.position;   // Take the initial position 
} 

void FixedUpdate() 
{ 
    input = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")); 
    actualSpeed = Input.GetKey(KeyCode.LeftShift) ? walkingVelocity : runingVelocity; 

    if (input != Vector2.zero && p == transform.position) 
    { 

     //CalcularHierbaAlta(); 
     if (Mathf.Abs(input.x) > Mathf.Abs(input.y)) 
     { 
      if (input.x > 0) 
      { 
       //direccion = Direccion.Este; 
       //PuedeMoverse = CalcularFrente(); 
       p += Vector3.right; 
       anim.SetFloat("input_x", input.x); 
       anim.SetFloat("input_y", input.y); 
       anim.SetBool("isMoving", true); 
      } 
      else 
      { 
       p -= Vector3.right; 
       anim.SetFloat("input_x", input.x); 
       anim.SetFloat("input_y", input.y); 
       anim.SetBool("isMoving", true); 
      } 
     } 
     else 
     { 
      if (input.y > 0) 
      { 
       p += Vector3.up; 
       anim.SetFloat("input_x", input.x); 
       anim.SetFloat("input_y", input.y); 
       anim.SetBool("isMoving", true); 
      } 
      else 
      { 
       p -= Vector3.up; 
       anim.SetFloat("input_x", input.x); 
       anim.SetFloat("input_y", input.y); 
       anim.SetBool("isMoving", true); 
      } 
     } 
    }else if (input == Vector2.zero) 
    { 
     anim.SetBool("isMoving", false); 
    } 
    transform.position = Vector3.MoveTowards(transform.position, p, actualSpeed * Time.deltaTime); 
} 

はどうもありがとうございました!

答えて

1

すでに方向が向いていないか確認してください。そうでない場合は、オブジェクトを回転させます。すでにキープレスがあなたを移動させる方向に向いている場合は、プレーヤー/オブジェクトを移動します。

+0

0で初期化され、この問題は明日に解決されますが、私はあなたが自分でそれを行うことができることを確信しています。神、それはとても明白でした!私はまだそれを試していないが、それは多くの意味があります。ありがとう! :) – James

2

私は正確に同じ問題を抱えていたし、これは私がそれを行うために管理方法です;) ライン

if (pressWalkTime >= 8) { 

がで移動を開始する前に、ボタンを押すことができますどのように多くのフレームを決定するために使用することができます方向。

if (horizontal != 0 || vertical != 0) { 
     if (pressWalkTime != 0 || !direction.Equals (new Vector2 (horizontal, vertical))) { 
      pressWalkTime++; 

      if (pressWalkTime >= 8) { 
       pressWalkTime = 0; 
      } 
     } else { 
      pressWalkTime = 0; 
     } 

     direction = new Vector2 (horizontal, vertical); 

     if (pressWalkTime == 0 && base.AttemptMove (horizontal, vertical)) { 
      position += new Vector2 (horizontal, vertical); 
     } 

     if (horizontal == 1) 
      animator.Play ("Walk-Right"); 

     if (horizontal == -1) 
      animator.Play ("Walk-Left"); 

     if (vertical == 1) 
      animator.Play ("Walk-Up"); 

     if (vertical == -1) 
      animator.Play ("Walk-Down"); 

    } else 
     pressWalkTime = 0; 
} 

また、これはターンを処理できないことに注意する必要があります。つまり、すでにある方向に歩いていて、別の方向に戻ってきた場合、移動を開始するには8フレームをもう一度待たなければなりません。私のオハイオ州)

pressWalkTimeは、このロジックがで書かれたクラスの属性であり、

+0

ああbtwメソッドbase.AttemptMoveは、あなたが入力したいフィールドがアクセス可能であるかどうかをチェックするだけです。しかし、私はそれがobviosだと思います –

関連する問題