【问题标题】:I want to create a spiral motion of an object in C# for Unity我想在 C# 中为 Unity 创建一个对象的螺旋运动
【发布时间】:2020-05-28 08:00:22
【问题描述】:

我创建了一个 C# 脚本来定义 3D 平面中对象的 spiral motion

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class spiralanti : MonoBehaviour
{
    float angles;
    float radiuss;
    float angleSpeed;
    float rSpeed;
    // Start is called before the first frame update
    void Start()
    {
        angles = 0;
        radiuss = 10;
        angleSpeed = 150;
        rSpeed = 0.7f;
        angles = Mathf.Max(0, Mathf.PI);
        radiuss = Mathf.Max(0, radiuss);

        //float x = 0;
        // float y = 0;
        // float z = 0;
    }

    // Update is called once per frame
    void Update()
    {
        angles += Time.deltaTime * angleSpeed;
        radiuss -= Time.deltaTime * rSpeed;
        if (radiuss == 0)
        {
            float x = 0;
            float y = 0;
            float z = 0;

            transform.position = new Vector3(x, y, z);
        }

        else
        {
            float x = radiuss * Mathf.Cos(Mathf.Deg2Rad * angles);
            float z = radiuss * Mathf.Sin(Mathf.Deg2Rad * angles);
            float y = 0;

            transform.position = new Vector3(x, y, z);
        }


        }

 }

物体的螺旋形非常好,但我想让它在到达原点时停止并停留在那里。我已经尝试过代码中给出的 if-else 语句,但它并没有停止。相反,它从向内螺旋变成向外螺旋。

请帮我写代码。

【问题讨论】:

  • 你的意思是把if (radiuss == 0)改成这个if (radiuss <= 0)
  • 由于舍入误差,半径可能永远不会完全为零。尝试将您的支票更改为if (radiuss <= 0)

标签: c# unity3d math


【解决方案1】:

首先:切勿使用== 比较两个float 值。

由于floating point imprecision,该值可能与另一个值不完全匹配,即使在逻辑上您会这样认为。

Unity 使用 if 的示例

10f / 10f != 1f

因为有时这可能类似于 1.000000010.999999999

如果你想检查确切的值而不是使用Mathf.Approximately

if(Mathf.Approximately(a,b))

基本上等于

if(Mathf.Abs(a-b) <= Mathf.Epsilon)

其次是你的

radiuss -= Time.deltaTime * rSpeed;

允许超调,所以如果在运行之前radiuss 已经是&lt; Time.deltaTime * rSpeed,你最终会得到一个负值,它不完全是== 0,但可能是-0.00000001 或更小,所以你永远不会进入if 块.


所以你可以简单地使用

if(radius <= 0)
{
   transform.position = Vector3.zero;
}
...

或者你绝对可以确保它不低于0 并且这样做

radius = Mathf.Max(0, radius);
if(Mathf.Approximately(radius, 0))
{
    transform.position = Vector3.zero;
}
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-18
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多