【问题标题】:Unity2D - How to move AND rotate a gameobject around a circle in a 2D game?Unity2D - 如何在 2D 游戏中围绕圆圈移动和旋转游戏对象?
【发布时间】:2021-03-02 17:04:36
【问题描述】:

我正在尝试围绕目标行星(目前只是一个圆圈)移动和旋转一些云。我降低了动作,但我真的在旋转部分苦苦挣扎。我希望它与它在圆圈上的位置成比例旋转,但我一直试图猜测正确的数字。代码如下:

public class CloudMovement : MonoBehaviour
{
    public GameObject target;
    private float RotateSpeed = .05f;
    private float Radius = 1.0f;

    private Vector2 center;
    private float angle;

    private void Start()
    {
        center = target.transform.localPosition;
        Radius = target.transform.localScale.x / 1.5f;
    }

    private void Update()
    {

        angle = angle + RotateSpeed * Time.deltaTime;
        this.transform.Rotate (Vector3.forward * -angle * Time.deltaTime);

        Vector2 offset = new Vector2(Mathf.Sin(angle), Mathf.Cos(angle)) * Radius;
        this.transform.position = center + offset;
    }
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:
    using UnityEngine;
    
    public class CloudMovement : MonoBehaviour
    {
        // X Y radius
        public Vector2 Velocity = new Vector2(1, 0); 
    
        // rotational direction
        public bool Clockwise = true;
    
        [Range(0, 5)] 
        public float RotateSpeed = 1f;
        [Range(0, 5)]
        public float RotateRadiusX = 1f;
        [Range(0, 5)]
        public float RotateRadiusY = 1f;        
    
        private Vector2 _centre;
        private float _angle;
    
        private void Start()
        {
            _centre = transform.position;
        }
    
        private void Update()
        {
            _centre += Velocity * Time.deltaTime;    
            _angle += (Clockwise ? RotateSpeed : -RotateSpeed) * Time.deltaTime;    
            var x = Mathf.Sin(_angle) * RotateRadiusX;
            var y = Mathf.Cos(_angle) * RotateRadiusY;    
            transform.position = _centre + new Vector2(x, y);
        }
    
        void OnDrawGizmos()
        {
            Gizmos.DrawSphere(_centre, 0.1f);
            Gizmos.DrawLine(_centre, transform.position);
        }
    }
    

    编辑选项 2RotateAround

    一个更新的选项,融入 Unity——你也可以试试 RotateAround 函数

    Vector3 point = new Vector3(10,0,0);
    Vector3 axis =  new Vector3(0,0,1);
    transform.RotateAround(point, axis, Time.deltaTime * 10);
    

    transform.RotateAround() 采用 Vector3 PointAxis&float Angle`,以度为单位。

    轴是旋转方向。


    同样的事情,有一个工作样本from here

    public class CloudMovement : MonoBehaviour {
    
     public float speed;
     public Transform target;
    
     private Vector3 zAxis = new Vector3(0, 0, 1);
    
     void FixedUpdate () {
         transform.RotateAround(target.position, zAxis, speed); 
     }
    }
    

    【讨论】:

    • 它仍然没有旋转,这个脚本完成了我几乎相同的事情
    • 试试RotateAround()
    • RotateAround 非常适合我正在做的事情。谢谢!解决了它
    【解决方案2】:

    你可以!通过不断改变 x 比例!在update void中调用这个函数

    public void Rotate()
        {
            if (transform.localScale.x <= -1)
            {
                rotationBool = true;
            }
            if (transform.localScale.x >= 1)
            {
                rotationBool = false;
            }
            if (rotationBool == false)
            {
                Vector3 scaleChange = new Vector3(0.01f, 0f, 0f);
                transform.localScale -= scaleChange;
            }
            if (rotationBool == true)
            {
                Vector3 scaleChange = new Vector3(0.01f, 0f, 0f);
                transform.localScale += scaleChange;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-05
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      相关资源
      最近更新 更多