Могу ли я заставить скрипт C # читать C # и следовать тому, что он читает, и как я могу это сделать? - PullRequest
0 голосов
/ 28 декабря 2018

Я работаю над 2D-игрой Unity, в которой вы можете переключаться между разными персонажами и перемещать их, когда у вас под контролем и, когда они не контролируют, они ведут себя по-своему.Например: у меня есть два символа лоли, а другой поп.Главный герой Лоли, и вы можете перемещать ее, как вам угодно.Но что, если вам нужно куда-то двигаться, потому что есть враг, которого она не знает.Таким образом, игрок нажимает на поп, перемещает ее так же, как вы могли бы с лоли, и вы можете вернуться к управлению лоли, нажав обратно на лоли.Чтобы сделать это, мне нужно, чтобы каждый персонаж прочитал сценарий управления плеером и следовал тому, что он говорит, и они читали его только в том случае, если игрок нажал кнопку «loli» или «pop».Обратите внимание, что лоли является персонажем по умолчанию, поэтому, когда игра начинается, она контролируется игроком, если игрок не нажимает на кнопку «поп».Дело в том, что я знаю, как это сделать только на C, python и lua, а не на C #.Так как мне это сделать?Сделать метод в коде игрока и сказать другим, чтобы он ссылался на него?

код игрока

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


public class user : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{ 
    public int move = 5;
    private int acceleration = 2;

    public int Acceleration { get => acceleration; set => acceleration = value;
}


// Update is called once per frame
void Update()
{
    if(Input.GetKey(KeyCode.W))
    {
        transform.position = Vector2.up * move * Input.GetAxis("Vertical");
    }
    if (Input.GetKey(KeyCode.S))
    {
        transform.position = Vector2.down * move * Input.GetAxis("Vertical");
    }
    if (Input.GetKey(KeyCode.D))
    {
        transform.position = Vector2.right * move * Input.GetAxis("Horizontal");
    }
    if (Input.GetKey(KeyCode.A))
    {
        transform.position = Vector2.left * move * Input.GetAxis("Horizontal");
    }
}
}

код Лоли

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

public class loli : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{

}

// Update is called once per frame
void Update()
{
    /*
     * read user.cs. until another character has been selected
     * then I'll do my own thing :D
     * Until I get clicked on D:
    */
}
}

код поп:

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

public class pop : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{

}

// Update is called once per frame
void Update()
{
    /*
     * if i have been clicked on,
     * read user.cs.
     * else, do my own thing :D
    */
}
}

1 Ответ

0 голосов
/ 28 декабря 2018

То, о чем вы прямо просите, не является подходящим способом решения проблемы, а именно вопросом о том, как разделить общее поведение между двумя объектами GameObject.

Лучший способ подойти к этому - поместить один экземплярсценария user на GameObject Лоли и отдельного его экземпляра на GameObject Попа.Затем в user вы добавляете логическое поле, которое отслеживает, является ли он текущим активным символом:

public class user : MonoBehaviour
{
    public bool isActiveCharacter = false;

    ...

И в Update не делайте ничего ненужного, если вы неактивный символ

public class user : MonoBehaviour
{

    ...

    void Update()
    {
        // Stuff that should happen on every frame, 
        // e.g., checking if this character is clicked on

        if (!isActiveCharacter) return;

        // Stuff that should only happen when character is selected 

        if(Input.GetKey(KeyCode.W))

        ...

И в редакторе вы можете установить isActiveCharacter для компонента user Лоли равным true, чтобы она была активным символом по умолчанию.

Затем вам нужно только написать код, который устанавливает соответствующий isActiveCharacter при нажатии на этот символ и устанавливает для другого значение false.Один из способов - дать каждому user ссылку на другой (если будет только два пользователя):

public class user : MonoBehaviour
{
    public bool isActiveCharacter = false;
    public user other;

    ...

Вы можете назначить эту ссылку в редакторе (или использовать GameObject.Findнайти его динамически, что может быть очень медленным).Затем в коде, который обнаруживает щелчки на символе, вы устанавливаете other.isActiveCharacter = false;.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...