Смена персонажа. Проблема с озданием его префаба

Общие вопросы о Unity3D

Re: Смена персонажа. Проблема с озданием его префаба

Сообщение seaman 09 июл 2017, 17:21

Тогда как Samana написал.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Смена персонажа. Проблема с озданием его префаба

Сообщение mops94 09 июл 2017, 18:04

samana писал(а):
mops94 писал(а):
seaman писал(а):И кнопки и перс создаются на новой сцене по новому? Тогда привязывайте onclick в коде.


Подскажите пожалуйста как это сделать? У меня получается создается персонаж из префаба и как он через код его скрипта может находить эти кнопки? это стало бы реально решением проблемы

Если у вас действительно в каждой сцене новые кнопки и новый персонаж, то связать их можно так.
Допустим есть персонаж имя которого в иерархии Player и на нём есть скрипт PlayerController с публичными методами moveLeft и moveRight.
Так же в иерархии есть две кнопки с именами ButtonLeft и ButtonRight.
Будем делать поиск по именам объектов. Для этого в старте любого скрипта делаете следующее

Синтаксис:
Используется csharp
Button leftButton = GameObject.Find("ButtonLeft").GetComponent<Button>();  //находим кнопку "влево" и получаем её компонент Button
Button rightButton = GameObject.Find("ButtonRight").GetComponent<Button>();// то же самое для кнопки "вправо"

PlayerController playerController = GameObject.Find("Player").GetComponent<PlayerController>(); // находим игрока с имерем "Player" и получаем ссылку на его скрипт PlayerController

leftButton.onClick.AddListener(playerController.moveLeft); //привязываем метод игрока moveLeft к клику кнопки leftButton
rightButton.onClick.AddListener(playerController.moveRight);//аналогично для правой кнопки


Получилось но есть куча проблем. Не реагирует на джойстик который находится на сцене. Должен реагировать через Input manager. Не могу понять почему после создания префаба рабочего персонажа он потом работает через задницу даже без тех кнопок. Кидаю код своего персонажа и код которій вы мне подсказали.
Синтаксис:
Используется csharp
using UnityEngine;
using CnControls;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.SceneManagement;


public class Character : Unit
{

   

    private bool Dead = false;

    public int bulletsNumber ;
    public Text BulletsNumber;

    public Slider sliderHP;

    private int lives = 10;

    public int Lives
    {
        get { return lives; }
        set
        {
            if ( value < 11 ) lives = value;
         
        }

    }

   
        private float speed  = 3.0f;
        private float jumpForce  = 10.0f;
        private bool isGrounded = false;
       
        new private Rigidbody2D rigidbody;
    private Bullet bullet;
       
        private Animator animator;
       
        private SpriteRenderer sprite ;
   

    private CharState State
    {
       get { return (CharState)animator.GetInteger("State"); }
       set { animator.SetInteger("State", (int)value); }
       

    }

        private void Awake() {

       

                rigidbody = GetComponent<Rigidbody2D>();
                animator = GetComponent <Animator>();
                sprite = GetComponentInChildren<SpriteRenderer>();
        bullet = Resources.Load<Bullet>("Bullet");


        }

        private void FixedUpdate()
        {
                GroundCheck ();
        }
       
        // Use this for initialization
        void Start () {

       

        bulletsNumber = PlayerPrefs.GetInt("GunBullets");

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


        PlayerPrefs.SetInt("GunBullets", bulletsNumber);

        BulletsNumber.text = bulletsNumber.ToString();

        sliderHP.value = lives;

       if (Dead == false) {

        if (isGrounded  && CnInputManager.GetAxis("Horizontal") != 0)
        {
            State = CharState.Run;
        }
        else if(isGrounded && State != CharState.Sit)
                State = CharState.Idle;
               

            Vector3 position = new Vector3(CnInputManager.GetAxis("Horizontal") ,0f);

        transform.position += position * Time.deltaTime * speed;

        sprite.flipX = position.x < 0.0f;

           

            if (lives < 1)
            {
                Dead = true;

                StartCoroutine(Death());
                transform.Rotate(0, 0, 90);
               
            }

           
        }

       
    }
    public void Sit()
    {
       
            State = CharState.Sit;
       
    }


    public void Jump()
    {
        if (isGrounded)
        {
           
            State = CharState.Jump;
           
        }
        rigidbody.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
    }

    public override void Receivedamage()
    {
        Lives--;
        Debug.Log(lives);
        rigidbody.velocity = Vector2.zero;
        rigidbody.AddForce(Vector2.up * 5.0F, ForceMode2D.Impulse);
       
    }

    private void GroundCheck()
        {
                Collider2D[] colliders = Physics2D.OverlapCircleAll (transform.position, 0.3f);
                isGrounded = colliders.Length > 2;
        if (!isGrounded) State = CharState.Jump;
    }

    public void Shoot()
    {
       
       

        Vector3 position = transform.position; position.y += 0.8F;
        if (State == CharState.Sit)

        {  position.y -= 0.5F; }

        if(bulletsNumber > 0)
        {
            Bullet newBullet = Instantiate(bullet, position, bullet.transform.rotation) as Bullet;
            bulletsNumber--;
            newBullet.Parent = gameObject;
            newBullet.Direction = newBullet.transform.right * (sprite.flipX ? -1.0F : 1.0F);

        }
             
               

    }

    private void OnTriggerEnter2D(Collider2D collider)
    {
        Bullet bullet = collider.gameObject.GetComponent<Bullet>();

        if (bullet && bullet.Parent != gameObject)

            Receivedamage();
       
    }
   
    IEnumerator Death()
    {
       
        yield return new WaitForSeconds(4.0f);
        Destroy(gameObject, 1);
        SceneManager.LoadScene(2);
    }


}

public enum CharState
{   Idle,
    Run,
    Jump,
    Sit
   
}

А этот код на скрипте выхода

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class ExitScript : MonoBehaviour {

    public ScoresControl NullMoney;



   
    void Start()
    {
        Character playerController = GameObject.Find("Character1").GetComponent<Character>();
        Button JumpButton = GameObject.Find("JumpButton").GetComponent<Button>();
        JumpButton.onClick.AddListener(playerController.Jump);

    }

    void Update()
    {
       
    }


    public void ExitToMenu()
    {
        NullMoney.money = 0;
        SceneManager.LoadScene(0);

       
    }

    public void RestartGame()
    {
        SceneManager.LoadScene(1);
        NullMoney.money = 0;
    }

   
}
Последний раз редактировалось mops94 09 июл 2017, 18:11, всего редактировалось 1 раз.
mops94
UNец
 
Сообщения: 20
Зарегистрирован: 29 фев 2016, 17:12

Re: Смена персонажа. Проблема с озданием его префаба

Сообщение mops94 09 июл 2017, 18:09

Вообщем главная проблема что не работает Джойстик который через Ассет CNInputManager. Он подключен через библиотеку CNCcntrols. Он должен ходить с помощью джойстика а он не ходит
mops94
UNец
 
Сообщения: 20
Зарегистрирован: 29 фев 2016, 17:12

Re: Смена персонажа. Проблема с озданием его префаба

Сообщение mops94 09 июл 2017, 18:36

И еще один вопрос! Почему нельзя вписывать значения В АПДЕЙт? Вот например я пишу в старт Slider SliderHP = GameObject.Find("SliderHP").GetComponent<Slider>();

и мне надо написать по идее в апдейт
SliderHP.value = playerController.Lives;

Но мне компилятор не позволяет это сделать. А если я пишу не в старт Slider SliderHP = GameObject.Find("SliderHP").GetComponent<Slider>(); то компилятор ругается
mops94
UNец
 
Сообщения: 20
Зарегистрирован: 29 фев 2016, 17:12

Re: Смена персонажа. Проблема с озданием его префаба

Сообщение mops94 09 июл 2017, 18:48

Короче прописал всю логику в том скрипте на сцене и движения и все) теперь все работает! Спасибо огромное ребята!!!
mops94
UNец
 
Сообщения: 20
Зарегистрирован: 29 фев 2016, 17:12

Re: Смена персонажа. Проблема с озданием его префаба

Сообщение mops94 09 июл 2017, 18:50

samana писал(а):
mops94 писал(а):
seaman писал(а):И кнопки и перс создаются на новой сцене по новому? Тогда привязывайте onclick в коде.


Подскажите пожалуйста как это сделать? У меня получается создается персонаж из префаба и как он через код его скрипта может находить эти кнопки? это стало бы реально решением проблемы

Если у вас действительно в каждой сцене новые кнопки и новый персонаж, то связать их можно так.
Допустим есть персонаж имя которого в иерархии Player и на нём есть скрипт PlayerController с публичными методами moveLeft и moveRight.
Так же в иерархии есть две кнопки с именами ButtonLeft и ButtonRight.
Будем делать поиск по именам объектов. Для этого в старте любого скрипта делаете следующее

Синтаксис:
Используется csharp
Button leftButton = GameObject.Find("ButtonLeft").GetComponent<Button>();  //находим кнопку "влево" и получаем её компонент Button
Button rightButton = GameObject.Find("ButtonRight").GetComponent<Button>();// то же самое для кнопки "вправо"

PlayerController playerController = GameObject.Find("Player").GetComponent<PlayerController>(); // находим игрока с имерем "Player" и получаем ссылку на его скрипт PlayerController

leftButton.onClick.AddListener(playerController.moveLeft); //привязываем метод игрока moveLeft к клику кнопки leftButton
rightButton.onClick.AddListener(playerController.moveRight);//аналогично для правой кнопки


Спасибо огромное выручили!!!!
mops94
UNец
 
Сообщения: 20
Зарегистрирован: 29 фев 2016, 17:12

Re: Смена персонажа. Проблема с озданием его префаба

Сообщение samana 09 июл 2017, 19:45

О, тут столько ответов появилось! Рад, что всё получилось в итоге!
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Смена персонажа. Проблема с озданием его префаба

Сообщение eonyanov 13 июл 2017, 10:49

Я вообще не понял, зачем ты ищешь кнопки?
Если ты используешь CNControls, то у тебя на сцене должна быть кнопка от этого же плагина, на этой кнопке висит скрипт SimpleButton и есть поле ButtonName. Ты кидаешь кнопку на сцену, и в редакторе прописываешь нужное название кнопки. Например, "Jump". Когда ты её нажимаешь, то CnInputManager будет знать, что кнопка нажата. Не надо её искать и куда то привязывать.
Просто в коде пишешь
Синтаксис:
Используется csharp
bool jump = CnControls.CnInputManager.GetButtonDown("Jump");


Тоже самое с джойстиками.
Аналогичный подход используется в стандартном ассете CrossPlatformInput.
Glow Asteroids Game
Happy Chair
Аватара пользователя
eonyanov
UNITрон
 
Сообщения: 298
Зарегистрирован: 22 авг 2014, 10:28

Пред.

Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18