現在、3D空間をキャラクターが自由に動く処理を作成しようと考えているのですが、以下の処理で実行すると「W+A」、「S+D」を同時押しした時に変な方向に動いてしまいます。「W+A」は左上に移動すべきところが右上に、「S+D」は右下に移動すべきところが左下に移動してしまいます。  
理由が分かる方がいらっしゃいましたら、ご教授頂けると幸いです。

```

    public class WalkAnimation : MonoBehaviour
    {
        private Animator anm;
        private Rigidbody rb;
        private Vector3 latestPos;
    
        void Start()
        {
            anm = GetComponent<Animator>();
            rb = GetComponent<Rigidbody>();
        }
    
        void Update()
        {
            if(Input.GetKey(KeyCode.W))
            {
                OnAnimator(-100);
            }
            else if(Input.GetKey(KeyCode.S))
            {
                OnAnimator(100);
            }
            else if (Input.GetKey(KeyCode.A))
            {
                OnAnimator(100);
            }
            else if (Input.GetKey(KeyCode.D))
            {
                OnAnimator(-100);
            }
            else
            {
                OffAnimator();
            }
        }
    
        private void OnAnimator(int walk)
        {
            anm.SetBool("Walk", true);
            Vector3 diff = transform.position - latestPos;
            latestPos = transform.position;
    
            if (diff.magnitude > 0.01f)
            {
                transform.rotation = Quaternion.LookRotation(diff);
            }
    
            if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S))
            {
                rb.AddForce(0, 0, walk, ForceMode.Force);
            }
            if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D))
            {
                rb.AddForce(walk, 0, 0, ForceMode.Force);
            }
        }
    
        private void OffAnimator()
        {
            anm.SetBool("Walk", false);
        }
    }
    
```
CC BY-SA 4.0
2021-10-01T13:49:57.740
82808
2021-11-29T00:32:11.647
2021-10-01T14:27:37.490
3060
48224
question
c# unity3d
UnityのAddForsに関して
WとAを両方押した場合、Update関数でOnAnimator(-100)が実行され、  
OnAnimator関数の中で、walkの値が-100の状態で下記の部分が実行されています。

```

    if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D))
    {
        rb.AddForce(walk, 0, 0, ForceMode.Force);
    }
    
```

一方でAだけを押した場合はOnAnimator(100)が実行されるため、  
walkの値が100の状態で上記の処理が実行されています。

Aを押していることによって実行されるAddForceの向きが、Wと同時に押しているかどうかで変わってしまうことが原因です。

walkという変数がX軸、Y軸どちらにもなるという状況がややこしくなっている原因であるため、OnAnimator関数を下記のように変更してはいかがでしょうか？  
(Update関数内での呼び出しも適切に変更する)

```

    private void OnAnimator(int x, int z)
    {
        anm.SetBool("Walk", true);
        Vector3 diff = transform.position - latestPos;
        latestPos = transform.position;
    
        if (diff.magnitude > 0.01f)
        {
            transform.rotation = Quaternion.LookRotation(diff);
        }
    
        rb.AddForce(x, 0, z, ForceMode.Force);
    }
    
```
CC BY-SA 4.0
2021-11-28T12:40:41.367
83851
2021-11-29T00:32:11.647
2021-11-29T00:32:11.647
3060
35121
82808
answer