alguem pode me ajudar com essa adição de item numa lista?
3 participantes
Página 1 de 1
alguem pode me ajudar com essa adição de item numa lista?
o script fica no object, funcionalidade seria pegar Um ScriptableObject likando a ele e adicionar a uma lista!
Script Lista:
script add item:
Script Lista:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
public class InventoryController : MonoBehaviour
{
[SerializeField]
Item[] arrayInventory;
public List<Item>_Inventory { get; private set; }
public void Awake()
{
_Inventory = new List<Item>();
_Inventory = arrayInventory.OrderBy(i => i.Name).ToList();
MouseSensitive.IsClicked += RemoveItem;
}
private void OnDestroy()
{
MouseSensitive.IsClicked -= RemoveItem;
}
public void AddItem(Item item)
{
if (item != null)
_Inventory.Add (item);
}
public void RemoveItem(Item item)
{
if (item != null)
_Inventory.Remove (item);
}
}
script add item:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InteragirObjList : MonoBehaviour
{
public Transform jogador;
public ScriptableObject ItemDate;
public InventoryController _Inventory;
public KeyCode TeclaPegar = KeyCode.P;
[Range(1,5)]
public float distanciaMinima = 2;
void Awake ()
{
_Inventory = GetComponent<InventoryController>();
}
void Update ()
{
if (jogador)
{
{
if (Input.GetKeyDown (TeclaPegar))
{
ItemDate += _Inventory.AddItem(item) as ScriptableObject ;
}
}
}
}
}
Pkneves- Membro
- PONTOS : 451
REPUTAÇÃO : 10
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
Boa tarde meu caro!
O que exatamente está ocorrendo? qual seria o erro? também está faltando postar uma classe, o Item.
Abraço!
O que exatamente está ocorrendo? qual seria o erro? também está faltando postar uma classe, o Item.
Abraço!
Re: alguem pode me ajudar com essa adição de item numa lista?
era pra quando o item fosse pego somente o scriptableobject anexado ao script fosse adicionado a lista do inventorydstaroski escreveu:Boa tarde meu caro!
O que exatamente está ocorrendo? qual seria o erro? também está faltando postar uma classe, o Item.
Abraço!
Pkneves- Membro
- PONTOS : 451
REPUTAÇÃO : 10
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
dstaroski escreveu:Boa tarde meu caro!
O que exatamente está ocorrendo? qual seria o erro? também está faltando postar uma classe, o Item.
Abraço!
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
[CreateAssetMenu (fileName = "New Item", menuName = "Create Item")]
public class Item : ScriptableObject
{
public GameObject SpawnOBJ;
public Sprite Icon;
public string Name;
public string Description;
public int ID { get; private set; }
public int Count { get {
return
FindObjectOfType<InventoryController>()._Inventory.FindAll(x => x.ID == this.ID).Count;
}
}
private void OnEnable() =>
ID = this.GetInstanceID();
}
Pkneves- Membro
- PONTOS : 451
REPUTAÇÃO : 10
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
Explicação:
Acredito que você tenha errado na classe InteragirObjList na variavel ItemDate, a qual voce deixou com ScriptableObject (pelo que eu entendi o ItemDate seria o objeto a pegar?) e na hora de adicionar o item na linha 26:
Em relação ao ItemDate você teria que colocar a variável como Item, pois ele é uma Classe derivada do ScriptableObject e não a classe ScriptableObject em si. Tente deixar assim:
e na linha 26 voce coloca um "+=" para adicionar a lista? Não é assim que se faz a adição a uma lista. Como no outro script você já criou uma void responsável por fazer esta adição na classe InventoryController, tente deixar a linha 26 assim:
Script Completo com as modificações:
Acredito que você tenha errado na classe InteragirObjList na variavel ItemDate, a qual voce deixou com ScriptableObject (pelo que eu entendi o ItemDate seria o objeto a pegar?) e na hora de adicionar o item na linha 26:
- Código:
ItemDate += _Inventory.AddItem(item) as ScriptableObject;
Em relação ao ItemDate você teria que colocar a variável como Item, pois ele é uma Classe derivada do ScriptableObject e não a classe ScriptableObject em si. Tente deixar assim:
- Código:
public Item ItemDate;
e na linha 26 voce coloca um "+=" para adicionar a lista? Não é assim que se faz a adição a uma lista. Como no outro script você já criou uma void responsável por fazer esta adição na classe InventoryController, tente deixar a linha 26 assim:
- Código:
_Inventory.AddItem(ItemDate);
Script Completo com as modificações:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InteragirObjList : MonoBehaviour
{
public Transform jogador;
public Item ItemDate;
public InventoryController _Inventory;
public KeyCode TeclaPegar = KeyCode.P;
[Range(1,5)]
public float distanciaMinima = 2;
void Awake ()
{
_Inventory = GetComponent<InventoryController>();
}
void Update ()
{
if (jogador)
{
{
if (Input.GetKeyDown (TeclaPegar))
{
_Inventory.AddItem(ItemDate);
}
}
}
}
}
Pokedlg- ProgramadorMaster
-
PONTOS : 1389
REPUTAÇÃO : 184
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
ola boa noite;Pokedlg escreveu:Explicação:
Acredito que você tenha errado na classe InteragirObjList na variavel ItemDate, a qual voce deixou com ScriptableObject (pelo que eu entendi o ItemDate seria o objeto a pegar?) e na hora de adicionar o item na linha 26:
- Código:
ItemDate += _Inventory.AddItem(item) as ScriptableObject;
Em relação ao ItemDate você teria que colocar a variável como Item, pois ele é uma Classe derivada do ScriptableObject e não a classe ScriptableObject em si. Tente deixar assim:
- Código:
public Item ItemDate;
e na linha 26 voce coloca um "+=" para adicionar a lista? Não é assim que se faz a adição a uma lista. Como no outro script você já criou uma void responsável por fazer esta adição na classe InventoryController, tente deixar a linha 26 assim:
- Código:
_Inventory.AddItem(ItemDate);
Script Completo com as modificações:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InteragirObjList : MonoBehaviour
{
public Transform jogador;
public Item ItemDate;
public InventoryController _Inventory;
public KeyCode TeclaPegar = KeyCode.P;
[Range(1,5)]
public float distanciaMinima = 2;
void Awake ()
{
_Inventory = GetComponent<InventoryController>();
}
void Update ()
{
if (jogador)
{
{
if (Input.GetKeyDown (TeclaPegar))
{
_Inventory.AddItem(ItemDate);
}
}
}
}
}
o script continua apresentado erro e o item coletado nao aparece na lista//
erro:
NullReferenceException: Object reference not set to an instance of an object
InteragirObjList.Update () (at Assets/Scripts/Sistema de Inventario/InteragirObjList.cs:26)
desde de já agradeço pela ajuda!
Pkneves- Membro
- PONTOS : 451
REPUTAÇÃO : 10
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
Voce nao definiu o ItemDate, ele é nulo, voce não atribui nenhum valor ao ItemDate, voce tem que colocar que ele é o item mais próximo
Pokedlg- ProgramadorMaster
-
PONTOS : 1389
REPUTAÇÃO : 184
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
Pokedlg escreveu:Voce nao definiu o ItemDate, ele é nulo, voce não atribui nenhum valor ao ItemDate, voce tem que colocar que ele é o item mais próximo
poderia me explicar como fazer, sou novato com c#, sei mais +/- o basico
Pkneves- Membro
- PONTOS : 451
REPUTAÇÃO : 10
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
Fica um pouco dificil sem saber as circunstancias, seu jogo é 3d ou 2d? Voce ja fez o sistema para poder pegar o item, pois sem ele nao tem como voce pegar para poder adicioná-lo no inventário. Porque, vejo que voce tem uma variavel representando a distancia minima, mas nao faz uso dela. o ItemDate seria o item mais perto mesmo ou representa outra coisa?
Pokedlg- ProgramadorMaster
-
PONTOS : 1389
REPUTAÇÃO : 184
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
o jogo é 3d, o sistema para pegar o item seria esse código, no caso este script iria dentro do obj pagável, ItemDate representa um item"Scriptable' que contem os dados para passar para o inventário, no caso oq seria add na list do inventario seria o scriptable e a distancia mínima para controlar a distancia entre personagem e obj para dizer se pode pegar ou nPokedlg escreveu:Fica um pouco dificil sem saber as circunstancias, seu jogo é 3d ou 2d? Voce ja fez o sistema para poder pegar o item, pois sem ele nao tem como voce pegar para poder adicioná-lo no inventário. Porque, vejo que voce tem uma variavel representando a distancia minima, mas nao faz uso dela. o ItemDate seria o item mais perto mesmo ou representa outra coisa?
Pkneves- Membro
- PONTOS : 451
REPUTAÇÃO : 10
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
Tente assim:
Mas lembre-se de atribuir um scriptableobject para o itemDate, por exemplo se o objeto pegável é uma espada, atribui a ele o scriptable object da espada
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InteragirObjList : MonoBehaviour
{
public Transform jogador;
public Item ItemDate;
public InventoryController _Inventory;
public KeyCode TeclaPegar = KeyCode.P;
[Range(1,5)]
public float distanciaMinima = 2;
void Awake ()
{
_Inventory = GetComponent<InventoryController>();
}
void Update ()
{
float dist = Vector3.Distance(jogador.position, this.gameObject.position);
if (jogador)
{
{
if (dist <= distanciaMinima && Input.GetKeyDown (TeclaPegar))
{
_Inventory.AddItem(ItemDate);
}
}
}
}
}
Mas lembre-se de atribuir um scriptableobject para o itemDate, por exemplo se o objeto pegável é uma espada, atribui a ele o scriptable object da espada
Pokedlg- ProgramadorMaster
-
PONTOS : 1389
REPUTAÇÃO : 184
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
Pokedlg escreveu:Tente assim:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InteragirObjList : MonoBehaviour
{
public Transform jogador;
public Item ItemDate;
public InventoryController _Inventory;
public KeyCode TeclaPegar = KeyCode.P;
[Range(1,5)]
public float distanciaMinima = 2;
void Awake ()
{
_Inventory = GetComponent<InventoryController>();
}
void Update ()
{
float dist = Vector3.Distance(jogador.position, this.gameObject.position);
if (jogador)
{
{
if (dist <= distanciaMinima && Input.GetKeyDown (TeclaPegar))
{
_Inventory.AddItem(ItemDate);
}
}
}
}
}
Mas lembre-se de atribuir um scriptableobject para o itemDate, por exemplo se o objeto pegável é uma espada, atribui a ele o scriptable object da espada
ainda esta dando erro;
erro: Assets\Scripts\Sistema de Inventario\InteragirObjList.cs(21,67): error CS1061: 'GameObject' does not contain a definition for 'position' and no accessible extension method 'position' accepting a first argument of type 'GameObject' could be found (are you missing a using directive or an assembly reference?)
Pkneves- Membro
- PONTOS : 451
REPUTAÇÃO : 10
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
Opa, erro meu, esqueci do transform:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InteragirObjList : MonoBehaviour
{
public Transform jogador;
public Item ItemDate;
public InventoryController _Inventory;
public KeyCode TeclaPegar = KeyCode.P;
[Range(1,5)]
public float distanciaMinima = 2;
void Awake ()
{
_Inventory = GetComponent<InventoryController>();
}
void Update ()
{
float dist = Vector3.Distance(jogador.position, this.gameObject.transform.position);
if (jogador)
{
{
if (dist <= distanciaMinima && Input.GetKeyDown (TeclaPegar))
{
_Inventory.AddItem(ItemDate);
}
}
}
}
}
Pokedlg- ProgramadorMaster
-
PONTOS : 1389
REPUTAÇÃO : 184
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
Pokedlg escreveu:Opa, erro meu, esqueci do transform:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InteragirObjList : MonoBehaviour
{
public Transform jogador;
public Item ItemDate;
public InventoryController _Inventory;
public KeyCode TeclaPegar = KeyCode.P;
[Range(1,5)]
public float distanciaMinima = 2;
void Awake ()
{
_Inventory = GetComponent<InventoryController>();
}
void Update ()
{
float dist = Vector3.Distance(jogador.position, this.gameObject.transform.position);
if (jogador)
{
{
if (dist <= distanciaMinima && Input.GetKeyDown (TeclaPegar))
{
_Inventory.AddItem(ItemDate);
}
}
}
}
}
arrumou a 26, porem a linha 27 apareceu um nv, e continua sem add o Itemdate no inventário ;
erro: NullReferenceException: Object reference not set to an instance of an object
InteragirObjList.Update () (at Assets/Scripts/Sistema de Inventario/InteragirObjList.cs:27)
Pkneves- Membro
- PONTOS : 451
REPUTAÇÃO : 10
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
Cara é o que eu tinha dito anteriormente, ou é o ItemDate ou o _Inventory é nulo, você atribuiu o scriptableobject na variavel ItemDate de acordo com o item que possui esse script ? o Gameobject que possui esse script contém a classe InventoryController?
Pokedlg- ProgramadorMaster
-
PONTOS : 1389
REPUTAÇÃO : 184
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
o Gameobject que possui esse script nao contém a classe InventoryController, classe InventoryController fica em um Gameobject vazioPokedlg escreveu:Cara é o que eu tinha dito anteriormente, ou é o ItemDate ou o _Inventory é nulo, você atribuiu o scriptableobject na variavel ItemDate de acordo com o item que possui esse script ? o Gameobject que possui esse script contém a classe InventoryController?
Pkneves- Membro
- PONTOS : 451
REPUTAÇÃO : 10
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
Entao é isso que está causando o problema, voce usa:
Isso faz com que ele procure o script InventoryController no gameobject que vai o InteragirObjList, tente assim:
- Código:
_Inventory = GetComponent<InventoryController>();
Isso faz com que ele procure o script InventoryController no gameobject que vai o InteragirObjList, tente assim:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InteragirObjList : MonoBehaviour
{
public Transform jogador;
public Item ItemDate;
public InventoryController _Inventory;
public KeyCode TeclaPegar = KeyCode.P;
[Range(1,5)]
public float distanciaMinima = 2;
void Awake ()
{
_Inventory = FindObjectOfType<InventoryController>();
}
void Update ()
{
float dist = Vector3.Distance(jogador.position, this.gameObject.transform.position);
if (jogador)
{
{
if (dist <= distanciaMinima && Input.GetKeyDown (TeclaPegar))
{
_Inventory.AddItem(ItemDate);
}
}
}
}
}
Pokedlg- ProgramadorMaster
-
PONTOS : 1389
REPUTAÇÃO : 184
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
Pokedlg escreveu:Entao é isso que está causando o problema, voce usa:
- Código:
_Inventory = GetComponent<InventoryController>();
Isso faz com que ele procure o script InventoryController no gameobject que vai o InteragirObjList, tente assim:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InteragirObjList : MonoBehaviour
{
public Transform jogador;
public Item ItemDate;
public InventoryController _Inventory;
public KeyCode TeclaPegar = KeyCode.P;
[Range(1,5)]
public float distanciaMinima = 2;
void Awake ()
{
_Inventory = FindObjectOfType<InventoryController>();
}
void Update ()
{
float dist = Vector3.Distance(jogador.position, this.gameObject.transform.position);
if (jogador)
{
{
if (dist <= distanciaMinima && Input.GetKeyDown (TeclaPegar))
{
_Inventory.AddItem(ItemDate);
}
}
}
}
}
entendi Assim ele procura o script fora do gameobject... o erro sumiu porem msm assim o ItemDate nao é add ao array, ele na entra na lista
Pkneves- Membro
- PONTOS : 451
REPUTAÇÃO : 10
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
Pkneves escreveu:Pokedlg escreveu:Entao é isso que está causando o problema, voce usa:
- Código:
_Inventory = GetComponent<InventoryController>();
Isso faz com que ele procure o script InventoryController no gameobject que vai o InteragirObjList, tente assim:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InteragirObjList : MonoBehaviour
{
public Transform jogador;
public Item ItemDate;
public InventoryController _Inventory;
public KeyCode TeclaPegar = KeyCode.P;
[Range(1,5)]
public float distanciaMinima = 2;
void Awake ()
{
_Inventory = FindObjectOfType<InventoryController>();
}
void Update ()
{
float dist = Vector3.Distance(jogador.position, this.gameObject.transform.position);
if (jogador)
{
{
if (dist <= distanciaMinima && Input.GetKeyDown (TeclaPegar))
{
_Inventory.AddItem(ItemDate);
}
}
}
}
}
entendi Assim ele procura o script fora do gameobject... o erro sumiu porem msm assim o ItemDate nao é add ao array, ele na entra na lista
ele add o ItemDate no inventorio, porem nao add na arraylist ai quando acesso o painel do inventorio antes de pegar o ItemDate, ele buga quando eu pego e nao aparece mais no inventory, so funciona quando o o painel do inventário nao foi ativado ainda
Pkneves- Membro
- PONTOS : 451
REPUTAÇÃO : 10
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
Nao entendi muito bem, Nao aparece o item no inventário quando voce pega ele depois de abrir o inventario? é isso? Em que script colocou o instantiate dos itens no inventário?
Pokedlg- ProgramadorMaster
-
PONTOS : 1389
REPUTAÇÃO : 184
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
ele aparece no canvas do inventário, porem n add na list<t> arraylist, ai o sistema buga na hora de pegar como expliquei a cima...Pokedlg escreveu:Nao entendi muito bem, Nao aparece o item no inventário quando voce pega ele depois de abrir o inventario? é isso? Em que script colocou o instantiate dos itens no inventário?
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SlotsConfig : MonoBehaviour
{
public ItemReference _element;
private List<Item> _inventory;
void Start()
{
_inventory = new List<Item> ();
_inventory = FindObjectOfType<InventoryController> ()._Inventory;
InstantiateElements ();
}
private void InstantiateElements()
{
for (int i = 0; i < _inventory.Count; i++)
{
if (IsRepeated (i))
continue;
(Instantiate(_element, transform) as ItemReference).SetValues(_inventory [i]);
}
}
bool IsRepeated(int i)
{
if (i == 0)
return false;
return _inventory[i].ID == _inventory[i - 1].ID;
}
}
Pkneves- Membro
- PONTOS : 451
REPUTAÇÃO : 10
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
Não entendo como isso acontece sendo que você só faz utilização da arrayInventory na void Awake, quando inicia o jogo, quando ainda não pegou nenhum item, depois não vejo ela sendo utilizada mais em nada que possa ser a causa do problema, Mas caso for isso tente adicionar à array um limite que seria o limite de slots para o inventário e então adicione os itens a array com um loop for:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
public class InventoryController : MonoBehaviour
{
public Item[] arrayInventory; //deixe-a publica para podermos acessa-la no outro script
public int inventoryLimit; //no inspector defina um valor limite para que funcione
public List<Item>_Inventory { get; private set; }
public void Awake()
{
_Inventory = new List<Item>();
arrayInventory = new Item[inventoryLimit];
_Inventory = arrayInventory.OrderBy(i => i.Name).ToList();
MouseSensitive.IsClicked += RemoveItem;
}
private void OnDestroy()
{
MouseSensitive.IsClicked -= RemoveItem;
}
public void AddItem(Item item)
{
if (item != null)
_Inventory.Add (item);
}
public void RemoveItem(Item item)
{
if (item != null)
_Inventory.Remove (item);
}
}
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InteragirObjList : MonoBehaviour
{
public Transform jogador;
public Item ItemDate;
public InventoryController _Inventory;
public KeyCode TeclaPegar = KeyCode.P;
[Range(1,5)]
public float distanciaMinima = 2;
void Awake ()
{
_Inventory = FindObjectOfType<InventoryController>();
}
void Update ()
{
float dist = Vector3.Distance(jogador.position, this.gameObject.transform.position);
if (jogador)
{
{
if (dist <= distanciaMinima && Input.GetKeyDown (TeclaPegar))
{
for(int i =0; i<_Inventory.arrayInventory.Length; i++)
{
if(_Inventory.arrayInventory[i] == null)
{
_Inventory.arrayInventory[i] = ItemDate;
break;
}
}
_Inventory.AddItem(ItemDate);
}
}
}
}
}
Pokedlg- ProgramadorMaster
-
PONTOS : 1389
REPUTAÇÃO : 184
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
agr s ta adicionando no array, porem continuo com o problema na hora de instanciar no scroll view do painel de inventario, ao acessar o painel antes de pegar o ItemDate, ele meio q buga, e ao fechar o painel e tentar pegar o ItemDate ele nao instancia no scroll view.Pokedlg escreveu:Não entendo como isso acontece sendo que você só faz utilização da arrayInventory na void Awake, quando inicia o jogo, quando ainda não pegou nenhum item, depois não vejo ela sendo utilizada mais em nada que possa ser a causa do problema, Mas caso for isso tente adicionar à array um limite que seria o limite de slots para o inventário e então adicione os itens a array com um loop for:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
public class InventoryController : MonoBehaviour
{
public Item[] arrayInventory; //deixe-a publica para podermos acessa-la no outro script
public int inventoryLimit; //no inspector defina um valor limite para que funcione
public List<Item>_Inventory { get; private set; }
public void Awake()
{
_Inventory = new List<Item>();
arrayInventory = new Item[inventoryLimit];
_Inventory = arrayInventory.OrderBy(i => i.Name).ToList();
MouseSensitive.IsClicked += RemoveItem;
}
private void OnDestroy()
{
MouseSensitive.IsClicked -= RemoveItem;
}
public void AddItem(Item item)
{
if (item != null)
_Inventory.Add (item);
}
public void RemoveItem(Item item)
{
if (item != null)
_Inventory.Remove (item);
}
}
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InteragirObjList : MonoBehaviour
{
public Transform jogador;
public Item ItemDate;
public InventoryController _Inventory;
public KeyCode TeclaPegar = KeyCode.P;
[Range(1,5)]
public float distanciaMinima = 2;
void Awake ()
{
_Inventory = FindObjectOfType<InventoryController>();
}
void Update ()
{
float dist = Vector3.Distance(jogador.position, this.gameObject.transform.position);
if (jogador)
{
{
if (dist <= distanciaMinima && Input.GetKeyDown (TeclaPegar))
{
for(int i =0; i<_Inventory.arrayInventory.Length; i++)
{
if(_Inventory.arrayInventory[i] == null)
{
_Inventory.arrayInventory[i] = ItemDate;
break;
}
}
_Inventory.AddItem(ItemDate);
}
}
}
}
}
Porem quando pego o ItemDate antes do acesso ao painel o script funciona normal... e ao utilizar a " int inventoryLimit " recebo este erro.
erro:NullReferenceException: Object reference not set to an instance of an object
InventoryController+<>c.<Awake>b__6_0 (Item i) (at Assets/Scripts/Sistema de Inventario/InventoryController.cs:19)
System.Linq.EnumerableSorter`2[TElement,TKey].ComputeKeys (TElement[] elements, System.Int32 count) (at <3dc3a1be8c4f409081a57e8ef88f1fbb>:0)
System.Linq.EnumerableSorter`1[TElement].ComputeMap (TElement[] elements, System.Int32 count) (at <3dc3a1be8c4f409081a57e8ef88f1fbb>:0)
System.Linq.EnumerableSorter`1[TElement].Sort (TElement[] elements, System.Int32 count) (at <3dc3a1be8c4f409081a57e8ef88f1fbb>:0)
System.Linq.OrderedEnumerable`1[TElement].SortedMap (System.Linq.Buffer`1[TElement] buffer) (at <3dc3a1be8c4f409081a57e8ef88f1fbb>:0)
System.Linq.OrderedEnumerable`1[TElement].ToList () (at <3dc3a1be8c4f409081a57e8ef88f1fbb>:0)
System.Linq.Enumerable.ToList[TSource] (System.Collections.Generic.IEnumerable`1[T] source) (at <3dc3a1be8c4f409081a57e8ef88f1fbb>:0)
InventoryController.Awake () (at Assets/Scripts/Sistema de Inventario/InventoryController.cs:19)
Pkneves- Membro
- PONTOS : 451
REPUTAÇÃO : 10
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
Tenta excluir a linha 19, pra ver se resolve este erro.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
public class InventoryController : MonoBehaviour
{
public Item[] arrayInventory; //deixe-a publica para podermos acessa-la no outro script
public int inventoryLimit; //no inspector defina um valor limite para que funcione
public List<Item>_Inventory { get; private set; }
public void Awake()
{
_Inventory = new List<Item>();
arrayInventory = new Item[inventoryLimit];
MouseSensitive.IsClicked += RemoveItem;
}
private void OnDestroy()
{
MouseSensitive.IsClicked -= RemoveItem;
}
public void AddItem(Item item)
{
if (item != null)
_Inventory.Add (item);
}
public void RemoveItem(Item item)
{
if (item != null)
_Inventory.Remove (item);
}
}
Pokedlg- ProgramadorMaster
-
PONTOS : 1389
REPUTAÇÃO : 184
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
Pokedlg escreveu:Tenta excluir a linha 19, pra ver se resolve este erro.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
public class InventoryController : MonoBehaviour
{
public Item[] arrayInventory; //deixe-a publica para podermos acessa-la no outro script
public int inventoryLimit; //no inspector defina um valor limite para que funcione
public List<Item>_Inventory { get; private set; }
public void Awake()
{
_Inventory = new List<Item>();
arrayInventory = new Item[inventoryLimit];
MouseSensitive.IsClicked += RemoveItem;
}
private void OnDestroy()
{
MouseSensitive.IsClicked -= RemoveItem;
}
public void AddItem(Item item)
{
if (item != null)
_Inventory.Add (item);
}
public void RemoveItem(Item item)
{
if (item != null)
_Inventory.Remove (item);
}
}
O erro sumiu, porém o bagu permanece na instância do item no Scroll Viewr...
Hierarquia do seria Canvas > PainelINVENTORIO> Scroll View> Content ... No caso ele instancia dentro do Content!
Pkneves- Membro
- PONTOS : 451
REPUTAÇÃO : 10
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
Tem uma classe no projeto chamada menu de pause que controla a ativação do painel de inventário e outra classe Munu que controla a variação de acesso entre painel de inventário inventário de missões essa classe tem duas voids uma que acessa o painel de menu que pausa o jogo e uma que desativa o painel de o jogo despausaPkneves escreveu:Pokedlg escreveu:Tenta excluir a linha 19, pra ver se resolve este erro.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
public class InventoryController : MonoBehaviour
{
public Item[] arrayInventory; //deixe-a publica para podermos acessa-la no outro script
public int inventoryLimit; //no inspector defina um valor limite para que funcione
public List<Item>_Inventory { get; private set; }
public void Awake()
{
_Inventory = new List<Item>();
arrayInventory = new Item[inventoryLimit];
MouseSensitive.IsClicked += RemoveItem;
}
private void OnDestroy()
{
MouseSensitive.IsClicked -= RemoveItem;
}
public void AddItem(Item item)
{
if (item != null)
_Inventory.Add (item);
}
public void RemoveItem(Item item)
{
if (item != null)
_Inventory.Remove (item);
}
}
O erro sumiu, porém o bagu permanece na instância do item no Scroll Viewr...
Hierarquia do seria Canvas > PainelINVENTORIO> Scroll View> Content ... No caso ele instancia dentro do Content!
Pkneves- Membro
- PONTOS : 451
REPUTAÇÃO : 10
Respeito as regras :
Re: alguem pode me ajudar com essa adição de item numa lista?
Acredito que seja porque voce faz as funções apenas na void Awake e Start o que faz com que ele só funcione uma vez e não em tempo de execução, como tinha falado não precisa modificar o script para adicionar na array, pois ele só era chamada uma vez para colocar os itens para teste ao iniciar o programa. O que você tem que fazer é tornar o inventário funcional enquanto está executando, enquanto ele não foi aberto, ainda não chamou a void Start pois ele está desativado, por isso quando ele é ativado ele executa a void Start apenas uma vez e é quando você abre os slots e faz as instanciações, você citou ess script que ativa o painel do inventário, primeiro tente tornar o método de instanciar statico e publico:
e no script de ativar o painel do inventário adicione essa linha logo após ativá-lo:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SlotsConfig : MonoBehaviour
{
public ItemReference _element;
private List<Item> _inventory;
void Start()
{
_inventory = new List<Item> ();
_inventory = FindObjectOfType<InventoryController> ()._Inventory;
}
public static void InstantiateElements()
{
for (int i = 0; i < _inventory.Count; i++)
{
if (IsRepeated (i))
continue;
(Instantiate(_element, transform) as ItemReference).SetValues(_inventory [i]);
}
}
bool IsRepeated(int i)
{
if (i == 0)
return false;
return _inventory[i].ID == _inventory[i - 1].ID;
}
}
e no script de ativar o painel do inventário adicione essa linha logo após ativá-lo:
- Código:
SlotsConfig.InstantiateElements();
Pokedlg- ProgramadorMaster
-
PONTOS : 1389
REPUTAÇÃO : 184
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :

» duvida, alguem pode me ajudar?
» alguem pode ajudar sobre ID@Xbox
» Alguém pode me ajudar com o Script de som dos passos?
» Alguém pode me ajudar bug de Lighting por favor
» alguem pode me ajudar com esse script
» alguem pode ajudar sobre ID@Xbox
» Alguém pode me ajudar com o Script de som dos passos?
» Alguém pode me ajudar bug de Lighting por favor
» alguem pode me ajudar com esse script
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos