繁体   English   中英

为什么我的角色每次不动时只向目标旋转一次?

[英]Why does my character only rotate to the target one time every time it doesn't move?

我的问题可能听起来令人困惑,但我想编写代码,以便当我的角色不动时,他会直接看向最近的敌人。 问题是当我停止移动我的角色时,它只执行一次命令并且不会重定向到敌人的新位置。 我测试了很多东西,比如让它在我移动时,它看着敌人,它似乎工作,但每当我将它设置为不动时,它就不起作用。

using System.Collections.Generic;
using UnityEngine;
namespace work.working.worked
{
    public class Movement : MonoBehaviour
    {
        public float moveSpeed;
        public float rotationSpeed;
        public static bool ismoving;
        public Rigidbody2D rb;
        Vector2 movement;
        // Update is called once per frame
        void FixedUpdate()
        {
            rb.MovePosition(rb.position + movement * moveSpeed * Time.fixedDeltaTime);
        }
        void Update()
        {
            movement.x = Input.GetAxisRaw("Horizontal");
            movement.y = Input.GetAxisRaw("Vertical");
            if (Input.anyKey)
            {
                ismoving = true;
            }
            else
            {
                ismoving = false;
            }
            if (ismoving == true)
            {
                Vector2 direction = new Vector2(movement.x, movement.y);
                direction.Normalize();
                if (direction != Vector2.zero)
                {
                    Quaternion toRotation = Quaternion.LookRotation(Vector3.forward, direction);
                    transform.rotation = Quaternion.RotateTowards(transform.rotation, toRotation, rotationSpeed * Time.deltaTime);
                }
            }
            if (ismoving == false)
            {
                Vector3 direction = FindClosest.closestEnemy.position - transform.position;
                direction.Normalize();
                float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg - 85f;
                rb.rotation = angle;
            }
        }
    }
}

除了 Input.anyKey,您还可以检查移动向量的大小以查看角色是否在移动。

ismoving = movement.magnitude > 0.0f;
using System.Collections.Generic;
using UnityEngine;
namespace work.working.worked
{
    public class Movement : MonoBehaviour
    {
        public float moveSpeed;
        public float rotationSpeed;
        public bool ismoving;
        public Rigidbody2D rb;
        Vector2 movement;
        

        void FixedUpdate()
        {
            rb.MovePosition(rb.position + movement * moveSpeed * Time.fixedDeltaTime);
        }

        void Update()
        {
            movement.x = Input.GetAxisRaw("Horizontal");
            movement.y = Input.GetAxisRaw("Vertical");
            ismoving = movement.magnitude > 0.0f;

            if (ismoving)
            {
                Vector2 direction = new Vector2(movement.x, movement.y);
                direction.Normalize();
                if (direction != Vector2.zero)
                {
                    Quaternion toRotation = Quaternion.LookRotation(Vector3.forward, direction);
                    transform.rotation = Quaternion.RotateTowards(transform.rotation, toRotation, rotationSpeed * Time.deltaTime);
                }
            }
            else
            {
                Vector3 direction = FindClosest.closestEnemy.position - transform.position;
                direction.Normalize();
                float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg - 85f;
                rb.rotation = angle;
            }
        }
    }

也不ismoving变量设为静态,否则它会被加载场景中的每个活动移动组件设置,这可能会导致意外行为。 如果它是公开的,您可以通过选择带有移动组件的游戏对象在 Unity 检查器中查看它的状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM