Страница 2 из 2

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

СообщениеДобавлено: 09 июл 2017, 17:21
seaman
Тогда как Samana написал.

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

СообщениеДобавлено: 09 июл 2017, 18:04
mops94
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;
    }

   
}

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

СообщениеДобавлено: 09 июл 2017, 18:09
mops94
Вообщем главная проблема что не работает Джойстик который через Ассет CNInputManager. Он подключен через библиотеку CNCcntrols. Он должен ходить с помощью джойстика а он не ходит

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

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

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

Но мне компилятор не позволяет это сделать. А если я пишу не в старт Slider SliderHP = GameObject.Find("SliderHP").GetComponent<Slider>(); то компилятор ругается

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

СообщениеДобавлено: 09 июл 2017, 18:48
mops94
Короче прописал всю логику в том скрипте на сцене и движения и все) теперь все работает! Спасибо огромное ребята!!!

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

СообщениеДобавлено: 09 июл 2017, 18:50
mops94
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);//аналогично для правой кнопки


Спасибо огромное выручили!!!!

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

СообщениеДобавлено: 09 июл 2017, 19:45
samana
О, тут столько ответов появилось! Рад, что всё получилось в итоге!

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

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


Тоже самое с джойстиками.
Аналогичный подход используется в стандартном ассете CrossPlatformInput.