Я пытаюсь создать базовый сценарий движения в unity, но постоянно появляется ошибка

#c# #unity3d

Вопрос:

Я пытаюсь создать базовый сценарий движения в unity, но он продолжает появляться с ошибкой:

AssetsMove.cs(5,14): ошибка CS1106: Метод расширения должен быть определен в неродовом статическом классе

Затем я попытался добавить ключевое слово static в расширение (TransformExtension) и все, что в нем есть, но в итоге получил ошибки:

AssetsMove.cs(27,10): ошибка CS0708: «Запуск»: не удается объявить члены экземпляра в статическом классе

AssetsMove.cs(33,10): ошибка CS0708: «Обновление»: не удается объявить члены экземпляра в статическом классе

AssetsMove.cs(38,10): ошибка CS0708: «перемещение»: не удается объявить члены экземпляра в статическом классе

Поэтому я добавил ключевое слово static в функции «Запуск», «Обновление» и «перемещение».

Затем я заканчиваю с ошибками:

AssetsMove.cs(42,32): ошибка CS0103: Имя «преобразование» не существует в текущем контексте

AssetsMove.cs(43,13): ошибка CS0103: Имя «преобразование» не существует в текущем контексте

По сути, они говорят мне удалить статические ключевые слова, чтобы move() мог получить доступ к расширению, но если я это сделаю, я закончу так же, как и раньше.

Я покажу код, который я сделал по пути ниже, хотя я считаю, что это был второй набор ошибок, которые я неправильно интерпретировал.

Оригинал

 
using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Move : MonoBehaviour

{

    public float speed;

}


    // Start is called before the first frame update
    void Start() //
    {
        
    }

    // Update is called once per frame
    void Update() //
    {
        move();
    }

    void move() //
    {
        if (Input.GetKey (KeyCode.UpArrow))
        {
            float upArrowOld = transform.position;
            transform.SetY(upArrowOld   1);
        }
    }
}

public class TransformExtentions

{

    public void SetX(this Transform transform, float x)

    {

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

    }

    public void SetY(this Transform transform, float y)

    {

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

    }

    public void SetZ(this Transform transform, float z)

    {

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

}

 

After 1st step

 
using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Move : MonoBehaviour

{

    public float speed;

}


    // Start is called before the first frame update
    void Start() 
    {
        
    }

    // Update is called once per frame
    void Update() 
    {
        move();
    }

    void move() 
    {
        if (Input.GetKey (KeyCode.UpArrow))
        {
            float upArrowOld = transform.position;
            transform.SetY(upArrowOld   1);
        }
    }
}

public static class TransformExtentions

{

    public static void SetX(this Transform transform, float x)

    {

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

    }

    public static void SetY(this Transform transform, float y)

    {

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

    }

    public static void SetZ(this Transform transform, float z)

    {

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

}

 

*Final

 using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Move : MonoBehaviour

{

    public float speed;

}


    // Start is called before the first frame update
    static void Start() 
    {
        
    }

    // Update is called once per frame
    static void Update()
    {
        move();
    }

    static void move()
    {
        if (Input.GetKey (KeyCode.UpArrow))
        {
            float upArrowOld = transform.position;
            transform.SetY(upArrowOld   1);
        }
    }
}

public static class TransformExtentions

{

    public static void SetX(this Transform transform, float x)

    {

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

    }

    public static void SetY(this Transform transform, float y)

    {

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

    }

    public static void SetZ(this Transform transform, float z)

    {

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

}


 

Редактировать (Спасибо Киту, Деруго и Томасу Бруне)

Я добавил еще один } в конец скрипта (для расширения), удалил ключевые слова «это» из расширения и удалил } после публичной скорости перемещения; . Однако в итоге я получил следующие ошибки:

AssetsMove.cs(26,32): ошибка CS0029: Не удается неявно преобразовать тип ‘UnityEngine.Вектор3’ в положение «плавающий»

AssetsMove.cs(27,23): ошибка CS1061: «Преобразование» не содержит определения для «setY», и не удалось найти доступный метод расширения «setY», принимающий первый аргумент типа «Преобразование» (отсутствует директива using или ссылка на сборку?)

Мой новый код выглядит следующим образом:

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

public class Move : MonoBehaviour
{
    public float speed;


    // Start is called before the first frame update
    void Start() //
    {
        
    }

    // Update is called once per frame
    void Update() //
    {
        move();
    }

    void move() //
    {
        if (Input.GetKey (KeyCode.UpArrow))
        {
            float upArrowOld = transform.position;
            transform.SetY(upArrowOld   1);
        }
    }
}

public class TransformExtentions
{
    public void SetX(Transform transform, float x)
    {
    transform.position = new Vector3(x, transform.position.y, transform.position.z);
    }
    public void SetY(Transform transform, float y)
    {
    transform.position = new Vector3(transform.position.x, y, transform.position.z);
    }
    public void SetZ(Transform transform, float z)
    {
    transform.position = new Vector3(transform.position.x, transform.position.y, z);
    }
}

 

Комментарии:

1. Похоже на опечатку: удалите это } после private float speed; … и нет Start и Update т. Д. Определенно не может быть static , чтобы они принадлежали экземпляру a MonoBehviour !

Ответ №1:

Возможно, помогло бы удаление ключевого слова this из параметров методов.

Попробуй:

 public void SetX(Transform transform, float x)
 

Вместо:

 public void SetX(this Transform transform, float x)