玩家对象在移动操纵杆时连续旋转



我为移动设备创建了一个双摇杆移动系统。我有一个角色在一个操纵杆的影响下正确地移动。另一个操纵杆,我想要的设计是:

  • 当镜头JS移动时,朝那个方向看。
  • 释放射击JS后,按最后瞄准的方向射击。
    现在的情况是,当游戏开始时,角色会连续射击,如果我移动ShootJS,角色会绕圈旋转。我完全弄不明白为什么会发生这种事
    这是我的代码。提前感谢任何人为您提供的帮助。
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.AI;
    using Ludiq;
    using Bolt;
    
    public class PlayerJSControlSc : MonoBehaviour
    {
    public GameObject player;
    public NavMeshAgent nav;
    public Text stateText;
    public float moveSpeed;
    public Animator animator;
    public FloatingJoystick moveJS;
    public FloatingJoystick shootJS;
    public float rotationSpeed = 10;
    public int ammo;
    public int mag;
    public Transform shotSpawn;
    public GameObject bullet;
    public float reloadTime;
    public Text ammoCount;
    [HideInInspector]
    int currentMag;
    
    // Start is called before the first frame update
    void Start()
    {
    stateText.text = "";
    nav = player.GetComponent<NavMeshAgent>();
    animator = player.GetComponent<Animator>();
    moveJS = GameObject.Find("Floating JS_Move").GetComponent<FloatingJoystick>();
    shootJS = GameObject.Find("Floating JS_Shoot").GetComponent<FloatingJoystick>();
    }
    // Update is called once per frame
    void Update()
    {
    movePlayer();
    playerShoot();
    ammoCount.text = currentMag+ "/" + ammo;
    }
    public void movePlayer()
    {
    //float x = Input.GetAxis("Horizontal");
    //float y = Input.GetAxis("Vertical");
    float x = moveJS.Horizontal;
    float y = moveJS.Vertical;
    nav.velocity = new Vector3(x * moveSpeed, 0, y * moveSpeed);
    if (nav.velocity.x != 0 || nav.velocity.z != 0)
    { animator.SetBool("isRunning", true); }
    else { animator.SetBool("isRunning", false); }
    
    }
    
    
    public void playerShoot()
    {
    bool isAiming = false;
    float x = shootJS.Horizontal; float z = shootJS.Vertical;
    if (x != 0 || z != 0)
    {
    isAiming = true;
    /* Vector3 lookDir = new Vector3(x, 0, z);
    Quaternion lookRotation = Quaternion.LookRotation(lookDir, Vector3.up);
    float step = rotationSpeed * Time.deltaTime;
    player.transform.rotation = Quaternion.RotateTowards(lookRotation, transform.rotation, step);*/
    float myAngle = Mathf.Atan2(x, z) * Mathf.Rad2Deg;
    float bodyRotation = myAngle + player.transform.eulerAngles.y;
    player.transform.Rotate( 0,myAngle,0,Space.World);
    }
    else { shoot();isAiming = false; }
    }
    void shoot()
    {
    if (currentMag > 0)
    {
    Instantiate(bullet, shotSpawn.position, shotSpawn.rotation);
    currentMag--;
    }
    else if (currentMag=0)
    {
    StartCoroutine(reload());
    }
    else
    return;
    }
    
    IEnumerator reload()
    {
    
    ammo = ammo - mag;
    currentMag = mag;
    yield return new WaitForSeconds(reloadTime);
    }       
    }
    
  • 您正在调用每帧playerShoot()->不移动->CCD_ 2。

    并且同样地playerShoot()->不移动->player.transform.Rotate( 0,myAngle,0,Space.World);


    我认为你应该做的是

    • 仅在两个输入均为0的第一帧中执行shoot
    • 对于移动,设置旋转而不是增加旋转

    类似的东西

    private bool lastFrameMoved;
    public void playerShoot()
    {
    float x = shootJS.Horizontal; 
    float z = shootJS.Vertical;
    if (x != 0 || z != 0)
    {
    var lookDir = new Vector3(x, 0, z);
    var lookRotation = Quaternion.LookRotation(lookDir, Vector3.up);
    player.transform.rotation = lookRotation;
    lastFrameMoved = true;
    }
    else 
    { 
    if(lastFrameMoved)
    {
    shoot();
    }
    lastFrameMoved = false;
    }
    }
    

    我解决了Bolt中的外观旋转(因为它有助于我可视化(。我很快就会解决拍摄部分。我使用的是Fenerax Studios的精彩游戏手柄包
    https://assetstore.unity.com/publishers/32730