Этот скрипт (код) отлично работает в UnityScript, но теперь я хочу переключить его на C#. Это то, что у меня есть до сих пор. Я думаю, что есть проблема с «transform.position» и созданием «случайной позиции» для моего персонажа. Наверное, это очень просто, но я новичок в C#, поэтому, пожалуйста, помогите мне.
public class AntScript : MonoBehaviour
{
public GameObject ant;
public GameObject scoreText;
public GameObject livesText;
public double walkingSpeed = 0.0f;
public int livesNumber = 3;
public int scoreNumber = 0;
float x;
float y;
void Start() { ant = GameObject.Find("Ant");
scoreText = GameObject.Find("Score");
livesText = GameObject.Find("Lives");
//Initialize the GUI components
livesText.GetComponent<Text>().text = "Lives Remaining: " + livesNumber;
scoreText.GetComponent<Text>().text = "Score: " + scoreNumber;
//Place the ant in a random position on start of the game
ant.transform.position.x = generateX();
ant.transform.position.y = generateY();
}
void Update()
{
Vector3 p = transform.position;
if (ant.transform.position.y < -4.35 && livesNumber > 0)
{
livesNumber -= 1;
livesText.GetComponent<Text>().text = "Lives Remaining: " + livesNumber;
generateCoordinates();
}
else if (ant.transform.position.y < -4.35 && livesNumber == 0)
{
Destroy(GameObject.Find("Ant"));
gameOver();
}
else
{
ant.transform.position.y -= walkingSpeed;
}
}
void gameOver()
{
Application.LoadLevel("GameOver");
}
//Generates random x
void generateX()
{
x = Random.Range(-2.54f, 2.54f);
//return x;
}
//Generates random y
void generateY()
{
y = Random.Range(-4.0f, 3.8f);
//return y;
}
//Move the "Ant" to the new coordiantess
void generateCoordinates()
{
//You clicked it!
scoreNumber += 1;
//Update the score display
scoreText.GetComponent<Text>().text = "Score: " + scoreNumber;
ant.transform.position.x = generateX();
ant.transform.position.y = generateY();
}
//If tapped or clicked
void OnMouseDown()
{
//Place the ant at another point
generateCoordinates();
//Increase the walking speed by 0.01
walkingSpeed += 0.01f;
}
}
Это действительно причуда С#, сначала мне потребовалось некоторое время, чтобы понять это.
Проблема в том, что transform.position — это не поле, это сеттер/геттер (это пара внутренних методов, представьте его как Vector3 GetPosition() и SetPosition (Vector3), что означает, что вам нужно передать в него целую структуру, вы не можете просто установить x или y (поскольку метод не может быть вызван, пока у вас нет всех параметров. Обходной путь действительно прост, к счастью
Vector3 temp = ant.transform.position; // use a getter
temp.x = generateX(); // modify a struct
temp.y = generateY();
ant.transform.position=temp; // use a setter
потому что вы не возвращаете y, а ваши generateX и generateY помечены как недействительные как невозвратные. Вместо переменных уровня класса они пытались заставить вас вернуть переменную из метода
@soosistvan у вас есть операторы возврата в ваших методах, просто раскомментируйте их (и измените тип возврата с void на float)
Затем вы можете снова сократить его до одной строки, используя transform.position = new Vector3(generateX(), generateY(), transform.position.z);
или, в случае 2D-приложения, просто new Vector2(generateX(), generateY())
Хорошо, но теперь у меня проблемы с generateX() и Y()..."Невозможно неявно преобразовать тип "void" в "float". ", а в других местах эта временная переменная уже не решает проблему... I' м очень плохо, извините... :D