Невозможно преобразовать double в float c#, даже если подумать, используя приведение, а не двойники в уравнении. Единство - PullRequest
0 голосов
/ 27 мая 2020

Хорошо, я искал ответ rnet и не смог его найти. Я очень новичок, начал 4 дня go.

У меня есть код, чтобы заставить игрока поворачиваться туда, куда он движется, как в flappy bird.

using UnityEngine;
using System;

public class PlayerAngle : MonoBehaviour
{
    public Rigidbody rb;

    // Update is called once per frame
    void Update()
    {

        float x = transform.rotation.x;
        float y = transform.rotation.y;
        float xvel = (float)rb.velocity.x;
        float yvel = (float)rb.velocity.y;

        x = Math.Sin(yvel);
        y = Math.Sin(xvel);

        transform.Rotate(x, y, 0);
    }
}

Он не хочет принимать xvel и yvel, которые должны быть с плавающей запятой в Math.Sin.

Вот точная ошибка, которую он мне дает:

Ошибка CS0266 Невозможно неявно преобразовать тип 'double ' держаться на плаву'. Существует явное преобразование (вам не хватает приведений?)

Пожалуйста, помогите мне, я потратил часы, пытаясь понять это.

Спасибо.

Ответы [ 4 ]

2 голосов
/ 27 мая 2020

Один из вариантов - преобразование результата Math.Sin в float:

    x = (float)Math.Sin(yvel);
    y = (float)Math.Sin(xvel);

. NET Math.Sin принимает и возвращает double, неявное преобразование из * От 1009 * до dobule существует , но в обратном порядке вам нужно использовать явное приведение.

1 голос
/ 27 мая 2020

Вы также можете использовать единство Mathf.Sin(), которое возвращает float

0 голосов
/ 28 мая 2020

Это вопрос, связанный с Unity, поэтому мы можем предположить, что вы пытались использовать класс Mathf stati c. Класс System.Math по умолчанию использует double .

В вашем коде действительно много посторонних операций. Например, вам не нужно читать значения transform.rotation.

С учетом всего этого ваш обновленный код будет выглядеть так:

void Update()
{
    var x = Mathf.Sin(rb.velocity.y);
    var y = Mathf.Sin(rb.velocity.x);
    transform.Rotate(x, y, 0);
}
0 голосов
/ 27 мая 2020

Ошибка сообщает вам, что не существует неявного преобразования из double в float.

Причина в том, что тип double является 64-битным числом (с двойной точностью), а тип float - только 32-битным числом (одинарной точности), поэтому существует возможность потери точности при преобразовании из double в float, и авторы не хотели, чтобы эта потеря произошла «случайно» во время задания.

Однако вы всегда можете явно привести значения к правильному типу:

x = (float) Math.Sin(yvel);
y = (float) Math.Sin(xvel);

Или, что еще лучше, просто использовать типы double на всем протяжении :

void Update()
{
    double xVel = rb.velocity.x;
    double yVel = rb.velocity.y;

    double x = Math.Sin(yVel);
    double y = Math.Sin(xVel);

    transform.Rotate(x, y, 0);
}

Или, точнее:

void Update()
{
    transform.Rotate(Math.Sin(rb.velocity.y), Math.Sin(rb.velocity.x), 0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...