Music manager

Pour populariser ou demander de l'aide pour vos propres add-ons!
Akinatronic
Messages : 1710
Inscription : 24 décembre 2014, 17:55
Localisation : Dans les étoiles
Contact :

Music manager

Message par Akinatronic » 21 mai 2015, 18:04

Salut, je voudrais développer un plugin pour KSP, mais je ne sais pas du tout comment m'y prendre... Le but serait de pouvoir déclencher des musiques selon des situations précises en jeu, telles que déclencher "Ainsi parlait Zarathrusta" lors d'un atterrissage sur une planète ou "Le beau Danube bleu" lors d'un docking... Merci d'avance pour vos conseils :D

Avatar de l’utilisateur
Malah
Messages : 1488
Inscription : 02 novembre 2014, 02:18
Localisation : Rennes
Contact :

Re: Music manager

Message par Malah » 21 mai 2015, 20:19

Déjà, il faut prendre en compte ton niveau de compétence en développement :p
Si tu parts de 0 ce sera vraiment compliqué, si tu connais des langages (même simple) ça le sera largement moins (le C# est vraiment simple et si tu connais le Boo, tu peux coder aussi avec ça, par exemple, SelectRoot est en Boo, possible que tu puisses le faire en javascript mais je n'en sais pas plus ...).

Il y a un petit tuto pour commencer : http://forum.kerbalspaceprogram.fr/view ... =30&t=3393
Personnellement j'utilise MonoDevelop car c'est le seul dispo sous linux (j'ai test le nouveau visual studio de microsoft qui est sorti récement en beta sur linux, mais il n'est pas assez complet et l'interface ... bien désolé pour les fan mais je la trouve à vomir :p). Par contre MonoDevelop ... bien lui c'est la stabilité qui lui fait défaut ... heureusement qu'il a une très bonne gestion des auto saves :p

Sinon les liens que j'utilise :
pour KSP : http://forum.kerbalspaceprogram.com/thr ... he-KSP-API et https://anatid.github.io/XML-Documentat ... index.html (mais la version XML intégré est juste parfaite)
pour Unity : http://docs.unity3d.com/ScriptReference/index.html (une petite recherche dans le "Search scripting..." et hop la réponse)
pour C# : http://www.dotnetperls.com/ et https://msdn.microsoft.com/en-us/librar ... ayhy6.aspx (dotnetperls est incroyable)

Les liens intéressents :
http://forum.kerbalspaceprogram.com/thr ... START-HERE
http://forum.kerbalspaceprogram.com/thr ... fb0b51a777

Mais bon, moi j'ai tout appris en lisant le code source des autres, en faite généralement quand je ne trouve pas une fonction existante dans l'API de KSP ou d'Unity je vais voir les modes dont je sais, qu'ils ont utilisés des fonctions s'en rapprochant ... (par exemple Chatterer pour l'audio est assez intéressent, même si maintenant il commence a y en avoir plusieurs autres pas trop mal dans le genre comme ceux de pizzaoverhead).

Sinon, j'ai eu l'occasion d'utilisé des sons pour MemoryUsage et qui plus est cette partie du code est super simple.
Si t'en veux d'autre de mes modes, je te conseillerais de regarder QuickBrake qui est largement le plus simple ;)

Juste en parlant de code (tout le reste est dans le tuto de kriyss) voilà comment se code un plugin :

Code : Tout sélectionner

using System;
using UnityEngine;

namespace TonPlugin {
	[KSPAddon(KSPAddon.Startup.EveryScene, false)]
	public class TonPlugin : MonoBehaviour {
		private void Awake() {
				//ton plugin se charge
		}

		private void Start() {
				//ton plugin demarre
		}

		private void Update() {
				//a chaque frame le code sera traité
		}

		private void OnDestroy() {
				//ton plugin s'arrète
		}
	}
}
Après il y a d'autres choses intéressantes à connaître (comme KSPAddon.Startup ou MonoBehaviour que j'ai pu citer dans mon exemple).

Si tu veux un détailles de l'ordre d'execution d'un plugin dans Unity, j'avais trouvé ça super intéressent : http://docs.unity3d.com/Manual/ExecutionOrder.html

J'espère ne pas t'avoir trop perdu ...

(Et pour les accros du code, pas la peine de me dire que je code comme mes pieds, j'ai jamais eu de cours de développement :p).

Edit : je tiens juste a préciser que, les exemples, que j'ai pu citer sont pour des plugins sans parts tandis que le tuto de kriyss c'est pour un plugin avec des part d'où le partmodule, après on peut aussi faire des plugins avec des scénario (scenariomodule) permettant de sauvegarder des choses dans la sauvegarde du joueur ...

Avatar de l’utilisateur
Malah
Messages : 1488
Inscription : 02 novembre 2014, 02:18
Localisation : Rennes
Contact :

Re: Music manager

Message par Malah » 08 décembre 2015, 00:27

Salut, je t'aurais pas un petit peut découragé dans ton projet ? Mince, aller pour me faire pardonner voilà ce que ça aurait du donner ;)
Ajouter d'autres situations doit prendre environ 30 secondes ;)

Code : Tout sélectionner

// Copyright 2015 Malah
// This is free and unencumbered software released into the public domain.

using System;
using UnityEngine;

namespace MusicManager {
	[KSPAddon(KSPAddon.Startup.Flight, false)]
	public class MusicManager : MonoBehaviour {

		public string OnLanded = "MusicManager/Sounds/AinsiParlaitZarathoustra";
		public string OnDock = "MusicManager/Sounds/LeBeauDanubeBleu";

		public float MusicVolume = 1f;

		private AudioClip AudioClip_OnLanded = new AudioClip();
		private AudioClip AudioClip_OnDock = new AudioClip();

		private AudioSource CurrentMusic = new AudioSource();
		private GameObject MusicPlayer = new GameObject();

		private void Awake() {
			GameEvents.onVesselSituationChange.Add(OnVesselSituationChange);
			Debug.Log ("Awake");
		}

		private void Start() {
			MusicPlayer.name = "MusicPlayer";

			CurrentMusic = MusicPlayer.AddComponent<AudioSource>();
			CurrentMusic.volume = MusicVolume;
			CurrentMusic.panLevel = 0;

			if (GameDatabase.Instance.ExistsAudioClip (OnLanded)) {
				AudioClip_OnLanded = GameDatabase.Instance.GetAudioClip (OnLanded);
			} else {
				Debug.LogWarning ("J'ai pas trouvé : " + OnLanded);
				Destroy (this);
			}
			if (GameDatabase.Instance.ExistsAudioClip (OnDock)) {
				AudioClip_OnDock = GameDatabase.Instance.GetAudioClip (OnDock);
			} else {
				Debug.LogWarning ("J'ai pas trouvé : " + OnDock);
				Destroy (this);
			}

			Debug.Log ("Start");
		}

		private void OnVesselSituationChange(GameEvents.HostedFromToAction<Vessel, Vessel.Situations> vessel) {
			if (CurrentMusic.isPlaying) {
				Debug.Log ("On n'écoute plus");
				CurrentMusic.Stop ();
			}
			CurrentMusic.clip = null;
			if (vessel.to == Vessel.Situations.LANDED) {
				CurrentMusic.clip = AudioClip_OnLanded;
				Debug.Log ("AudioClip_OnLanded");
			}
			if (vessel.to == Vessel.Situations.DOCKED) {
				CurrentMusic.clip = AudioClip_OnDock;
				Debug.Log ("AudioClip_OnDock");
			}
			if (CurrentMusic.clip != null) {
				if (CurrentMusic.clip.isReadyToPlay) {
					CurrentMusic.Play (2u);
					Debug.Log ("On écoute");
				}
			}
		}

		private void OnDestroy() {
			GameEvents.onVesselSituationChange.Remove(OnVesselSituationChange);
			Debug.Log ("OnDestroy");
		}
	}
}
Et la version complète (avec la version compilé, les musiques et le projet) : https://www.dropbox.com/s/o9zvj0h4r2h83 ... r.zip?dl=0

Akinatronic
Messages : 1710
Inscription : 24 décembre 2014, 17:55
Localisation : Dans les étoiles
Contact :

Re: Music manager

Message par Akinatronic » 08 décembre 2015, 12:06

Hé pas mal ! Et non je ne suis pas découragé, juste en manque de temps "Time may change me, but I can't trace time"...

Pour mon plugin je vais voir dans le code de Mech Jeb pour copier son menu déroulant (dans une interface graphique, ce serait là tout l'intérêt), pour sélectionner les musiques, et un autre pour les conditions de déclenchement, par exemple pour un docking :
-If current vessel had a docking port
-If targeted vessel has a docking port

Bien sûr le beau Danube bleu et ainsi parlait Zarathoustra ne sont que deux chansons, j'ai pas mal d'idées pour les autres...

Avatar de l’utilisateur
Malah
Messages : 1488
Inscription : 02 novembre 2014, 02:18
Localisation : Rennes
Contact :

Re: Music manager

Message par Malah » 08 décembre 2015, 13:04

Kerbalator285 a écrit :Pour mon plugin je vais voir dans le code de Mech Jeb pour copier son menu déroulant (dans une interface graphique, ce serait là tout l'intérêt), pour sélectionner les musiques
Personnellement, je ne suis pas un grand fan de ce genre de menu déroulant, mais bon tu peux le faire la licence de MechJeb est là LGPL3 donc tu as pas mal de latitude pour pouvoir fork des bouts de codes, indique juste les tronçons qui proviennent de MechJeb, avec référence à la LGPL3 ainsi que remerciement à Sarbian & r4m0n par contre il doit y avoir un petit quiproquo entre la GPL3 (indiqué sur les sources) et la LGPL3 (indiqué sur curse et sur le forum). Par contre, juste pour information ce bout de code risque de pas mal évoluer avec Unity 5 ;)
Kerbalator285 a écrit :et un autre pour les conditions de déclenchement, par exemple pour un docking :
-If current vessel had a docking port
-If targeted vessel has a docking port
Hum, je ne comprends pas bien, si il y a docking, il y a donc un docking port :p

Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit