#c# #visual-studio #function #unity3d #random
Вопрос:
Я пишу код перемещения объекта в случайные места. Я создал функцию, которая определяет случайные координаты и возвращает их. Однако я думаю, что функция и не связана вместе. Это то, что я пробовал…
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Movement : MonoBehaviour
{
public float speed;
Vector3 target;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
Vector3 target = random(target);
transform.position = Vector3.MoveTowards(transform.position, target, Time.deltaTime * speed);
}
Vector3 random(Vector3 target)
{
float min = -100.0f;
float max = 100.0f;
float randomX = Random.Range(min, max);
float randomZ = Random.Range(min, max);
Vector3 target = new Vector3(randomX, 10.0f, randomZ);
return target;
}
}
И это сообщение об ошибке, которое я получил.
AssetsMovement.cs(31,17): error CS0136: A local or parameter named 'target' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter
Как я могу это исправить?
Комментарии:
1. Пожалуйста, опубликуйте код в виде текста , а не изображений. Также объясните, что вы видите по сравнению с тем, что вы ожидали увидеть, и что вы сделали для диагностики проблемы (например, что произойдет, если вы запустите код в отладчике).
2. в чем заключается конкретная проблема, с которой вы сталкиваетесь? каков результат при запуске кода или ошибке?
3. Честно говоря, вы, скорее всего, все равно не захотите определять новое направление движения для каждого кадра …
Ответ №1:
Проблема в том, что вы определяете новую target
переменную внутри случайного метода. Вы уже определяли его как аргумент в теле метода ранее. Измените один из них.
Ответ №2:
На самом деле это проблема не с unity, а с компилятором.
Внутри методов random(цель Vector3) и void Update() вы определяете новые «целевые» переменные, такие как:
Vector3 target
таким образом, компилятор говорит вам, что это недопустимо. Если вы хотите обновить целевую переменную, удалите переднюю часть «Vector3» или выберите новое имя.
Неясно, как должна работать эта функция, но я думаю, что хорошо объявить цель при запуске или объявить ее общедоступной, чтобы вы могли назначить ей начальную позицию.
Я думаю, что ты хочешь чего-то подобного:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Movement : MonoBehaviour
{
public float speed;
// OPTIONAL: declare public so the editor will let you set a position
public Vector3 target;
// Start is called before the first frame update
void Start()
{
// OPTIONAL: you can set a start position
target = Vector3.zero;
}
// Update is called once per frame
void Update()
{
target = random(target);
transform.position = Vector3.MoveTowards(transform.position, target, Time.deltaTime * speed);
}
Vector3 random(Vector3 par)
{
float min = -100.0f;
float max = 100.0f;
float randomX = Random.Range(min, max);
float randomZ = Random.Range(min, max);
return new Vector3(randomX, 10.0f, randomZ);
}
ПРАВКА: Теперь вам действительно не нужен параметр для функции «случайный». Так что, может быть, вы сможете его удалить
Ответ №3:
Причина, по которой вы получаете эту ошибку, заключается в том, что вы уже объявлены Vector3 target
членом класса вне методов random
и. update
Если вы используете такой язык, как JavaScript, вы можете сделать это, объявив одно и то же имя переменной var во внутренней области, но в C# это невозможно.