#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
, чтобы они принадлежали экземпляру aMonoBehviour
!
Ответ №1:
Возможно, помогло бы удаление ключевого слова this
из параметров методов.
Попробуй:
public void SetX(Transform transform, float x)
Вместо:
public void SetX(this Transform transform, float x)