ищу помощи в скрипте

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

ищу помощи в скрипте

Сообщение limit 17 фев 2019, 16:05

столкнулся с проблемой:
thePlayerHealth.currentHealth = thePlayerHealth.HP; и HP = startHealth * currentCON; работают как бы с запозданием, то есть при переходе со 2 на 3 уровень HP так же переходит со 2 на 3 уровень, а вот currentHealth в этот момент с 1 на 2 уровень (а должно со 2 на 3 уровень как и HP)
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PlayerEXP : MonoBehaviour
{
    public int[] lvlSTR;
    public int[] lvlDEX;
    public int[] lvlINT;
    public int[] lvlCON;

    public int currentLvlSTR;
    public int currentLvlDEX;
    public int currentLvlINT;
    public int currentLvlCON;

    private playerHealth thePlayerHealth;

    public int currentLevel;
    public int currentExp;
    public int[] toLevelUp;
    public Slider expSlider;
    [SerializeField]
    Text lvlText;

    // Start is called before the first frame update
    void Start()
    {
        thePlayerHealth = FindObjectOfType<playerHealth>();

        currentLvlSTR = lvlSTR[1];
        currentLvlDEX = lvlDEX[1];
        currentLvlINT = lvlINT[1];
        currentLvlCON = lvlCON[1];
    }

    // Update is called once per frame
    void Update()
    {
        if (currentExp >= toLevelUp[currentLevel])
        {
            //currentLevel++;
            LevelUp();
            currentExp = 0;
            lvlText.text = currentLevel.ToString();
        }
    }
    public void AddExp(int expToAdd)
    {
        currentExp += expToAdd;
        expSlider.value = currentExp;
    }
    public void LevelUp()
    {


        currentLevel++;
        currentLvlSTR = lvlSTR[currentLevel];
        currentLvlDEX = lvlDEX[currentLevel];
        currentLvlINT = lvlINT[currentLevel];
        currentLvlCON = lvlCON[currentLevel];

       
        thePlayerHealth.currentHealth = thePlayerHealth.HP;
    }
}
 


Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;

public class playerHealth : MonoBehaviour
{

    public int currentSTR;
    public int currentDEX;
    public int currentINT;
    public int currentCON;

    private PlayerEXP thePlayerEXP;

    public float startHealth;
    public float HP;
    public float currentHealth;
    public GameObject deathFX;
    [SerializeField]
    Text hpText;

    public float PArmor;
    float PDamage;



   
    playerController controlMovement;
    public Slider healthSlider;

    void Start()
    {
       
        startHealth = 100f;
        currentHealth = startHealth;
        thePlayerEXP = FindObjectOfType<PlayerEXP>();
        controlMovement = GetComponent<playerController>();
    }


    void Update()
    {
        currentSTR = thePlayerEXP.currentLvlSTR;
        currentDEX = thePlayerEXP.currentLvlDEX;
        currentINT = thePlayerEXP.currentLvlINT;
        currentCON = thePlayerEXP.currentLvlCON;

        HP = startHealth * currentCON;

        healthSlider.value = currentHealth;
        hpText.text = currentHealth.ToString();

    }


    public void addDamage(float damage)
    {
        if (damage <= 0) return;

        PDamage = damage;
        currentHealth -= PDamage;
        Debug.Log(transform.name + " получает " + PDamage + " ед. урона.");
       

        if (currentHealth <= 0)
        {
            makeDead();
        }
    }
    public void makeDead()
    {
        Instantiate(deathFX, transform.position, transform.rotation);
        Destroy(gameObject);
    }
}
 
limit
UNец
 
Сообщения: 26
Зарегистрирован: 15 сен 2017, 00:11

Re: ищу помощи в скрипте

Сообщение Jarico 17 фев 2019, 16:27

Тебе не проще было бы всё в одном скрипте сделать? Кстати рекомендую выложить код на http://govnokod.ru/
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: ищу помощи в скрипте

Сообщение Friend123 17 фев 2019, 17:03

Ёмаё, я убил бы падавана за такое:
Синтаксис:
Используется csharp
   
void Update(){
        currentSTR = thePlayerEXP.currentLvlSTR;
        currentDEX = thePlayerEXP.currentLvlDEX;
        currentINT = thePlayerEXP.currentLvlINT;
        currentCON = thePlayerEXP.currentLvlCON;

        HP = startHealth * currentCON;

        healthSlider.value = currentHealth;
        hpText.text = currentHealth.ToString();

 }
 
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: ищу помощи в скрипте

Сообщение limit 17 фев 2019, 21:34

поправил немного скрипты. но проблема все та же а именно: как правильно currentHealth = HP что бы срабатывало только при получении уровня?
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PlayerEXP : MonoBehaviour
{
    public int[] lvlSTR;
    public int[] lvlDEX;
    public int[] lvlINT;
    public int[] lvlCON;

   
    private playerHealth thePlayerHealth;

    public int currentLevel;
    public int currentExp;
    public int[] toLevelUp;
    public Slider expSlider;
    [SerializeField]
    Text lvlText;

    // Start is called before the first frame update
    void Start()
    {
        thePlayerHealth = FindObjectOfType<playerHealth>();


        thePlayerHealth.currentSTR = lvlSTR[1];
        thePlayerHealth.currentDEX = lvlDEX[1];
        thePlayerHealth.currentINT = lvlINT[1];
        thePlayerHealth.currentCON = lvlCON[1];
    }

    // Update is called once per frame
    void Update()
    {
        if (currentExp >= toLevelUp[currentLevel])
        {
            //currentLevel++;
            LevelUp();
            currentExp = 0;
            lvlText.text = currentLevel.ToString();
        }
    }
    public void AddExp(int expToAdd)
    {
        currentExp += expToAdd;
        expSlider.value = currentExp;
    }
    public void LevelUp()
    {        
        currentLevel++;
        thePlayerHealth.currentSTR = lvlSTR[currentLevel];
        thePlayerHealth.currentDEX = lvlDEX[currentLevel];
        thePlayerHealth.currentINT = lvlINT[currentLevel];
        thePlayerHealth.currentCON = lvlCON[currentLevel];

    }
}
 


Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;

public class playerHealth : MonoBehaviour
{

    public float currentSTR;
    public float currentDEX;
    public float currentINT;
    public float currentCON;

    private PlayerEXP thePlayerEXP;

    public float startHealth;
    public float HP;
    public float currentHealth;
    public GameObject deathFX;
    [SerializeField]
    Text hpText;

    public float PArmor;
    float PDamage;



   
    playerController controlMovement;
    public Slider healthSlider;

    void Start()
    {
       
        startHealth = 100f;
        currentHealth = startHealth;
        thePlayerEXP = FindObjectOfType<PlayerEXP>();
        controlMovement = GetComponent<playerController>();
    }


    void Update()
    {
        HP = startHealth * currentCON;

        healthSlider.value = currentHealth;
        hpText.text = currentHealth.ToString();
               
    }




    public void addDamage(float damage)
    {
        if (damage <= 0) return;

        PDamage = damage;
        currentHealth -= PDamage;
        Debug.Log(transform.name + " получает " + PDamage + " ед. урона.");
       

        if (currentHealth <= 0)
        {
            makeDead();
        }
    }
    public void makeDead()
    {
        Instantiate(deathFX, transform.position, transform.rotation);
        Destroy(gameObject);
    }
}
limit
UNец
 
Сообщения: 26
Зарегистрирован: 15 сен 2017, 00:11

Re: ищу помощи в скрипте

Сообщение seaman 17 фев 2019, 22:03

По последнему варианту скриптов.

Объясните популярно зачем в playerHealth:
- PArmor? Он вообще не используется.
- три поля currentSTR, currentDEX и currentINT? Они только устанавливаются из PlayerEXP и вообще не используются.
- thePlayerEXP и controlMovement? - они только находится в старте и все.
- startHealth? Он только в старте устанавливается и все.
- HP? Оно только устанавливается в Update и все. Ну и отсюда - currentCON тоже не нужен - он только устанавливает HP, которое не нужно.
- PDamage? Он не испольуется. Используйте вместо него собственно параметр метода addDamage
- каждый кадр устанавливать слайдер и текст? Делайте это только когда меняется currentHealth

И в PlayerEXP соответсвенно:
- не нужны все эти массивы lvlSTR, lvlDEX, lvlINT, lvlCON
- из за того что не нужны эти массивы - не нужен thePlayerHealth и соответственно Start
- не нужно Update. Делайте все то что в нем только когда меняется currentExp

По вопросу- сейчас у Вас currentHealth вообще не зависит от HP

Получается что на данный момент скрипты можно так переписать:
Синтаксис:
Используется csharp
public class playerHealth : MonoBehaviour
{
    public float currentHealth;
    public GameObject deathFX;
    [SerializeField]
    Text hpText;
   
    public Slider healthSlider;

    void Start()
    {
        currentHealth = 100f;
    }

    public void addDamage(float damage)
    {
        if (damage <= 0) return;
       
        currentHealth -= damage;
        Debug.Log(transform.name + " получает " + damage + " ед. урона.");
        healthSlider.value = currentHealth;
        hpText.text = currentHealth.ToString();

        if (currentHealth <= 0) makeDead();
    }
    public void makeDead()
    {
        Instantiate(deathFX, transform.position, transform.rotation);
        Destroy(gameObject);
    }
}

public class PlayerEXP : MonoBehaviour
{
    public int currentLevel;
    public int currentExp;
    public int[] toLevelUp;
    public Slider expSlider;
    [SerializeField]
    Text lvlText;
   
    public void AddExp(int expToAdd)
    {
        currentExp += expToAdd;
        expSlider.value = currentExp;
        if (currentExp >= toLevelUp[currentLevel])
        {
            //currentLevel++;
            LevelUp();
            currentExp = 0;
            lvlText.text = currentLevel.ToString();
        }
    }
    public void LevelUp()
    {        
        currentLevel++;
    }
}


И, да все же тему - в "Почемучку".

ЗЫ: Да, в последнем варианте работать, конечно не будет (и исправленные тоже)
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: ищу помощи в скрипте

Сообщение seaman 17 фев 2019, 22:20

Ну а если посмотреть первый вариант, то похоже должно быть что то типа:
Синтаксис:
Используется csharp
public class PlayerEXP : MonoBehaviour
{
    private PlayerHealth thePlayerHealth;
    private int currentLevel;
    private int currentExp;
   
    public int[] lvlCON;    
    public int[] toLevelUp;    
    public Slider expSlider;
    public Text lvlText;

    void Start()
    {
        thePlayerHealth = FindObjectOfType<PlayerHealth>();
    }

    public void AddExp(int expToAdd)
    {
        currentExp += expToAdd;
        expSlider.value = currentExp;
        if (currentExp >= toLevelUp[currentLevel]) LevelUp();
    }
    public void LevelUp()
    {
        currentLevel++;      
        thePlayerHealth.SetHealthByLevelUp(lvlCON[currentLevel]);
        currentExp = 0;
        lvlText.text = currentLevel.ToString();
    }
}

public class PlayerHealth : MonoBehaviour
{
    private float startHealth;
    private float currentHealth;
   
    public GameObject deathFX;
    public Text hpText;
    public Slider healthSlider;

    void Start()
    {      
        startHealth = 100f;
        currentHealth = startHealth;
    }

    public void SetHealthByLevelUp(int lvlCon)
    {
        currentHealth = lvlCon * startHealth;
    }

    public void addDamage(float damage)
    {
        if (damage <= 0) return;

        currentHealth -= damage;
        Debug.Log(transform.name + " получает " + damage + " ед. урона.");
        healthSlider.value = currentHealth;
        hpText.text = currentHealth.ToString();      

        if (currentHealth <= 0) makeDead();
    }
    public void makeDead()
    {
        Instantiate(deathFX, transform.position, transform.rotation);
        Destroy(gameObject);
    }
}
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: ищу помощи в скрипте

Сообщение limit 17 фев 2019, 22:36

seaman писал(а):По последнему варианту скриптов.
По вопросу- сейчас у Вас currentHealth вообще не зависит от HP


я пытаюсь получить примерно следующее:
на старте 100(currentHealth)/100(HP)
на 2 уровне 300(currentHealth)/300(HP)
на 3 уровне 500(currentHealth)/500(HP)

как работает на данный момент:
на старте 100(currentHealth)/100(HP)
на 2 уровне 100(currentHealth)/300(HP)
на 3 уровне 300(currentHealth)/500(HP)

то есть при получении уровня изменяется значение (HP) и при этом (currentHealth) должно сравняться с (HP). но именно через (HP), потому что формула(HP) будет добавляться другими переменными
limit
UNец
 
Сообщения: 26
Зарегистрирован: 15 сен 2017, 00:11

Re: ищу помощи в скрипте

Сообщение Friend123 18 фев 2019, 00:21

Блин, мне как недопрограммисту очень больно видеть такие вопросы, да тут код написать за 5 минут... В чем проблема сравнять переменные, даже беря значение из массива?
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: ищу помощи в скрипте

Сообщение limit 18 фев 2019, 00:47

уровень моих знаний 0.0000000001 поэтому вот и прошу помощи))
limit
UNец
 
Сообщения: 26
Зарегистрирован: 15 сен 2017, 00:11

Re: ищу помощи в скрипте

Сообщение Saltant 18 фев 2019, 05:53

limit писал(а):уровень моих знаний 0.0000000001 поэтому вот и прошу помощи))

Походу сейчас ты пытаешься прыгнуть выше головы, проект который ты хочешь (уровни перса, характеристики, формулы и т.п) я так понял что то типа RPG игры, для создания игры этого жанра нужен вагон знаний и тонна времени.
Начни изучение с чего то более простого и элементарного, например сделай поле (2д игра) в котором будут находиться некие объекты, которые будут двигаться (хаотично или нет) и при столкновении с твоим персонажем уровень начинаться по новой (перс естественно под управлением игрока должен уклоняться), когда сделаешь этот функционал переходи к изучению UI - сделай статистику счет игры/смертей (которые не будут обнуляться при смене сцены когда уровень начинается по новой), далее усложняй геймплей (прибавь скорость "врагам", добавь ловушек и т.п) и собери еще один уровень который начинается при прохождении первого (добавь условие победы), потом когда совсем освоишься - можешь попробовать писать свою РПГ или начать изучать сеть.
З.Ы это всего лишь моя рекомендация, как я вижу старт новичка в геймдеве.
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2234
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

Re: ищу помощи в скрипте

Сообщение Friend123 18 фев 2019, 08:27

Saltant писал(а):как я вижу старт новичка в геймдеве.

Старт любого новичка, банально, но факт:
https://metanit.com/sharp/
https://docs.unity3d.com/Manual/index.html
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: ищу помощи в скрипте

Сообщение Saltant 18 фев 2019, 18:56

Friend123 писал(а):
Saltant писал(а):как я вижу старт новичка в геймдеве.

Старт любого новичка, банально, но факт:
https://metanit.com/sharp/
https://docs.unity3d.com/Manual/index.html

Чтиво без практики полная лажа. Лучше начать делать и если что то не ясно, - или гугл или документация. Просто как уже писал выше, не нужно сразу пытаться прыгнуть выше головы.
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2234
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт


Вернуться в Почемучка

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

Сейчас этот форум просматривают: Google [Bot] и гости: 22