Unity C# transform.Look при вращении на неправильной оси - PullRequest
0 голосов
/ 07 апреля 2020

Я составляю основы c основы RPG-игры. Его наведите и нажмите, используя navme sh. Я настроил игрока, чтобы он двигался к врагу и атаковал в радиусе действия. У меня проблема в том, что когда игрок достигает врага (или сундука / интерактива), он вращается вокруг оси х. Я предполагаю, что это как-то связано с функцией lookAt, использующей точку поворота целевого объекта, но я не могу найти решение. Любая помощь, направляющая меня к решению, была бы удивительной. Пару дней я просматривал сайты, форумы и API Unity. Я уверен, что это что-то простое, я просто не могу это увидеть.

Большая любовь

public class clickToMove : MonoBehaviour
{
    // Attack variables
    [Header("Attack")]
    public float attackDistance;
    public float attackRate;
    private float nextAttack;

    //Navigation variables
    private NavMeshAgent navMeshAgent;
    //private bool walking;

    //Animation variables
    private Animator anim;

    //Enemy variables
    private Transform targetedEnemy;
    private bool enemyClicked;

    //Interactable variables
    private Transform targetedObject;
    private bool objectClicked;

    void Awake()
    {
        anim = GetComponent<Animator>();
        navMeshAgent = GetComponent<NavMeshAgent>();
    }

    void Update()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Input.GetButton("Fire1"))
        {
            navMeshAgent.ResetPath();
            if(Physics.Raycast(ray, out hit, 1000))
            {
                if(hit.collider.tag == "Enemy")
                {
                    enemyClicked = true;
                    targetedEnemy = hit.transform;
                }
                else if (hit.collider.tag == "Chest")
                {
                    objectClicked = true;
                    targetedObject = hit.transform;
                }
                else if(hit.collider.tag == "Player")
                {
                    //walking = false;
                    navMeshAgent.isStopped = true;
                }
                else
                {
                    //walking = true;
                    enemyClicked = false;
                    navMeshAgent.isStopped = false;
                    navMeshAgent.destination = hit.point;
                }
            }
        }
        if (enemyClicked)
        {
            MoveAndAttack();
        }
        else if(objectClicked && targetedObject.gameObject.tag == "Chest")
        {
            Interaction(targetedObject);
        }
        else
        {
            if (!navMeshAgent.pathPending && navMeshAgent.remainingDistance <= navMeshAgent.stoppingDistance)
            {
                //walking = false;
            }
            else if (!navMeshAgent.pathPending && navMeshAgent.remainingDistance >= navMeshAgent.stoppingDistance)
            {
                //walking = true;
            }
        }
        //anim.SetBool("isWalking", walking);

        //TODO: needs finishing. Still need to lock it to the y axis to stop its rotation being funny.
        if (Input.GetKey(KeyCode.LeftShift))
        {
            //walking = false;
            navMeshAgent.isStopped = true;
            transform.LookAt(ray.origin + ray.direction * ((transform.position - Camera.main.transform.position).magnitude * 0.5f));
        }
    }

    // TODO: still a bug where the player rotates 15 deg on x axis when it reaches target. Has something to do with the Lookat function.
    void MoveAndAttack()
    {
        if (targetedEnemy == null)
        {
            return;
        }
        navMeshAgent.destination = targetedEnemy.position;

        if (!navMeshAgent.pathPending && navMeshAgent.remainingDistance >= attackDistance)
        {
            navMeshAgent.isStopped = false;
            //walking = true;
        }
        else if (!navMeshAgent.pathPending && navMeshAgent.remainingDistance <= attackDistance)
        {
            //anim.SetBool("isAttacking", false);
            transform.LookAt(targetedEnemy);
            Vector3 dirToAttack = targetedEnemy.transform.position - transform.position;

            if(Time.time > nextAttack)
            {
                nextAttack = Time.time + attackRate;
                //anim.SetBool("isAttacking", true);
            }
            navMeshAgent.isStopped = true;
            //walking = false;
        }
    }

    void Interaction(Transform target)
    {
        // set target
        navMeshAgent.destination = target.position;
        //go close to the target
        if(!navMeshAgent.pathPending && navMeshAgent.remainingDistance > attackDistance)
        {
            navMeshAgent.isStopped = false;
            //walking = true;
        }
        //read the info
        else if (!navMeshAgent.pathPending && navMeshAgent.remainingDistance <= attackDistance)
        {
            navMeshAgent.isStopped = true;
            transform.LookAt(targetedObject);
            //walking = false;

            //play animation
            //target.gameObject.getComponentInChildren<Animator>().SetTrigger("Open");

            objectClicked = false;
            navMeshAgent.ResetPath();
        }
    }
}
...