Inventaire Multijoueur

Pour les scripts écrits en Javascript (UnityScript). :!: Obsolète :!:
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Exeaa
Messages : 6
Inscription : 26 Fév 2015 12:38

Inventaire Multijoueur

Message par Exeaa » 26 Fév 2015 12:44

Bonjour/Bonsoir

Voila je travaille actuellement sur un RPG Multi-joueurs et j'ai un problème plutôt désagréable.

Lorsque je connecte mon joueur sur la map la console m'affiche qu'elle ne détecte pas d'inventaire, et elle bloque donc la possibilité de ramasser les objets. J'ai tout essayé quand le joueur spawn je vérifies "ses enfants" et l'inventaire y est bien.

J'ai fais l'inventaire avec le système banal proposé par unity dans le asset stores.

Merci de me proposer vos solutions.

Avatar de l’utilisateur
LudlowFx
Messages : 1367
Inscription : 19 Sep 2013 05:50

Re: Inventaire Multijoueur

Message par LudlowFx » 26 Fév 2015 12:50

Exeaa a écrit :Merci de me proposer vos solutions.
Merci de nous proposer vos codes en relations (et baliser ! Voir la Netiquette des Forums). Nous ne sommes pas des devins, comment voulez-vous que nous vous aidions avec aucune informations ?
Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

Exeaa
Messages : 6
Inscription : 26 Fév 2015 12:38

Re: Inventaire Multijoueur

Message par Exeaa » 26 Fév 2015 14:24

Doucement, j'pensais juste que vu que cette asset et mondialement connu par tout les utilisateur d'unity je n'aurais pas eu besoin de l'écrire, le soucis c'est que je ne sais pas d'où viens le problème enfin j'envoie quand même le script qui est pointé par le message d'erreur.


le message d'erreur :" No 'Inventory' found in game. The Item weapon has been disabled for pickup (canGet = false).
UnityEngine.Debug:LogWarning(Object)
Item:Awake() (at Assets/Inventory/Scripts/Items/Item.js:30)"

Le script:

Code : Tout sélectionner

 var itemIcon : Texture2D; //The Icon.
var canGet = true; //If we can pick up the Item.
var itemType : String; //This will let us equip the item to specific slots. Ex: Head, Shoulder, or whatever we set up. If the item is equipment (or weapon) this needs to match a slot to work properly.
var stackable = false; //Is it stackable? If yes then items with the same itemType will be stacked.
var maxStack = 20; //How many Items each stack can have before creating a new one. Remember that the Items that should be stacked should have the same itemType.
var stack = 1; //This is how many stack counts this Item will take up.
var isEquipment = true; //Can the Item be equipped? This includes weapons.
var isAlsoWeapon = false; //Is the Item also a Weapon? This only works with isEquipment set to true.

//This is the object we will instantiate in the Players hand.
//We use this so we can have two versions of the weapon. One for picking up and one for using.
var equippedWeaponVersion : Transform;

//These will store information about usefull components.
static var playersinv : Inventory;

private var FPPickUpFound = false;

@script AddComponentMenu ("Inventory/Items/Item")

//Here we find the components we need.
function Awake ()
{


	playersinv = FindObjectOfType(Inventory); //finding the players inv.
	if (playersinv == null)
	{
		canGet = false;
		Debug.LogWarning("No 'Inventory' found in game. The Item " + transform.name + " has been disabled for pickup (canGet = false).");
	}
	else
	{
		gameObject.SendMessage("RetrievePlayer", playersinv, SendMessageOptions.DontRequireReceiver);
	}
	
	if (isEquipment == false && GetComponent(ItemEffect) == null)
	{
		Debug.LogError(gameObject.name + " is not equipment so please assign an ItemEffect script to it");
	}
	
	if (GetComponent(FirstPersonPickUp) != null)
	{
		FPPickUpFound = true;
	}
	else if (transform.GetComponentInChildren(FirstPersonPickUp) != null)
	{
		FPPickUpFound = true;
	}
}

//When you click an item
function OnMouseDown()
{
	//If the 'FirstPersonPickUp' script is not attached we want to pick up the item.
	if (FPPickUpFound == false)
	{
		PickUpItem();
	}
}

//Picking up the Item.
function PickUpItem ()
{
	var getit=true;
	if(canGet){//if its getable or hasnt been gotten.
	
	playersinv.gameObject.SendMessage ("PlayPickUpSound", SendMessageOptions.DontRequireReceiver); //Play sound
	
		if(stackable){
			var locatedit:Item;
			for(var t:Transform in playersinv.Contents){
				if(t.name==this.transform.name){//if the item we wanna stack this on has the same name
					var i:Item=t.GetComponent(Item);
					if(i.stack<i.maxStack){
						locatedit=i;
					}
				}
			}
			if(locatedit!=null){//if we have a stack to stack it to!
				getit=false;
				locatedit.stack+=1;
				Destroy(this.gameObject);
			}
			else{
				getit=true;
			}
		}
		//If we can get it and the inventory isn't full.
		if (getit && playersinv.Contents.length < playersinv.MaxContent)
		{
			playersinv.AddItem(this.transform);
			MoveMeToThePlayer(playersinv.itemHolderObject);//moves the object, to the player
		}
		else if (playersinv.Contents.length >= playersinv.MaxContent)
		{
			Debug.Log("Inventory is full");
		}
	}
}

//Moves the item to the Players 'itemHolderObject' and disables it. In most cases this will just be the Inventory object.
function MoveMeToThePlayer(itemHolderObject : Transform)
{
	canGet = false;
	
	//gameObject.SetActive(false);	It's normally best to disable the individual components so we can keep item effects and update functions alive.
	
	if (GetComponent(MeshRenderer) != null)
	{
		GetComponent(MeshRenderer).enabled = false;
	}
	
	if (GetComponent(Collider) != null)
	{
		GetComponent(Collider).enabled = false;
	}
	
	GetComponent("Item").enabled = false;
	
	transform.parent = itemHolderObject;
	transform.localPosition = Vector3.zero;
}

//Drops the Item from the Inventory.
function DropMeFromThePlayer(makeDuplicate : boolean)
{
	if (makeDuplicate == false) //We use this if the object is not stacked and so we can just drop it.
	{
		canGet = true;
		gameObject.SetActive(true);
		
		if (GetComponent(MeshRenderer) != null)
		{
			GetComponent(MeshRenderer).enabled = true;
		}
		
		if (GetComponent(Collider) != null)
		{
			GetComponent(Collider).enabled = true;
		}
	
		GetComponent("Item").enabled = true;
		
		transform.parent = null;
		DelayPhysics();
	}
	else //If the object is stacked we need to make a clone of it and drop the clone instead.
	{
		canGet = true;
		clone = Instantiate(gameObject, transform.position, transform.rotation);
		canGet = false;
		clone.SetActive(true);
		
		if (clone.GetComponent(MeshRenderer) != null)
		{
			clone.GetComponent(MeshRenderer).enabled = true;
		}
		
		if (clone.GetComponent(Collider) != null)
		{
			clone.GetComponent(Collider).enabled = true;
		}
	
		clone.GetComponent("Item").enabled = true;
		
		clone.transform.parent = null;
		clone.name = gameObject.name;
	}
}

function DelayPhysics ()
{
	if (playersinv.transform.parent.collider != null && collider != null)
	{
		Physics.IgnoreCollision(playersinv.transform.parent.collider, collider, true);
		yield WaitForSeconds (1);
		Physics.IgnoreCollision(playersinv.transform.parent.collider, collider, false);
	}
}

//Drawing an 'I' icon on top of the Item in the scene to keep organised.
function OnDrawGizmos ()
{
	Gizmos.DrawIcon (Vector3(transform.position.x, transform.position.y + 1, transform.position.z), "ItemGizmo.png", true);
}

Dernière édition par Exeaa le 26 Fév 2015 15:19, édité 2 fois.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6246
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Inventaire Multijoueur

Message par boubouk50 » 26 Fév 2015 14:40

Utilise les balises [ code][ /code] pour ton code, c'est illisible.

Code : Tout sélectionner

playersinv = FindObjectOfType(Inventory);
Inventory est un Type valide? Il ne le trouve pas.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Exeaa
Messages : 6
Inscription : 26 Fév 2015 12:38

Re: Inventaire Multijoueur

Message par Exeaa » 26 Fév 2015 15:17

Ok je saurais pour la prochaine fois au niveau des balises.

Je saisie pas trop pour le reste :?

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6246
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Inventaire Multijoueur

Message par boubouk50 » 26 Fév 2015 15:52

Code : Tout sélectionner

playersinv = FindObjectOfType(Inventory);
Ici FindObjectOfType() va chercher le premier objet actif qu'il trouve de Type Inventory. Il n'en trouve aucun.
Deux pistes:
- Est-ce un type existant? (je pose la question, je ne sais pas)
- Vérifie que ton Inventaire est actif.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Exeaa
Messages : 6
Inscription : 26 Fév 2015 12:38

Re: Inventaire Multijoueur

Message par Exeaa » 26 Fév 2015 16:40

Oui il est existant quand le joueur spwan il spawn avec son inventaire. Si j'appuie sur "i" l'inventaire s'affiche mais je ne peux en aucun cas ramasser les items. Il est bien actif, on dirait que l'item cherche rapidement l'inventaire et vu que le joueur mets du temps a spawner il pense qu'il n'y en a pas.

Exeaa
Messages : 6
Inscription : 26 Fév 2015 12:38

Re: Inventaire Multijoueur

Message par Exeaa » 26 Fév 2015 16:50

Car, si je mets un joueur dans la scène sans passer par le faire spawn via le multi tout fonctionne parfaitement.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6246
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Inventaire Multijoueur

Message par boubouk50 » 26 Fév 2015 16:55

Il faut donc que ton script se lance quand l'inventaire est créé donc quand ton joueur est spawné.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Exeaa
Messages : 6
Inscription : 26 Fév 2015 12:38

Re: Inventaire Multijoueur

Message par Exeaa » 26 Fév 2015 17:08

J'ai mis un yield wait juste avant que la console recherche l'inventaire et je n'ai plus qu'un message d'erreur qui est:
"Script error (Item): Awake() can not be a coroutine."

En tout cas merci beaucoup pour ton aide précieuse, je comprenais pas le problème finalement il était bête. :lol:

Verrouillé

Revenir vers « (Js) Javascript »