Jump to content
Unity Insider Forum

12 Zielscheiben nach der reihe hochfahren lassen WIE?


Nisslex

Recommended Posts

Hi leute, hab da n script um 12 Zielscheiben hochfahren zu lassen die fix in der welt stehen und mit dem gleichen script bedient werden.

 

zur zeit ist es so das sie nach ner Random zeit hochfahren. also manchmal 2 oder 4 zugleich und dann wieder ein paar einzeln ganz zufällig je nachdem was sie für random zeit bekommen haben.

 

das funktioniert soweit auch supper nur würde ich ja gerne verschiedene schwierigkeits.. haben und da ist das mit dem random hochfahren nicht mehr funktional.

 

Ich hätte gerne das sie im zb. 2 sekunden intervall nach der reihe hochfahren. also die erste fährt hoch dann 2 sekunden warten dann fährt die nächste hoch...

 

Hier mal ein auszug aus dem script wo wie das commando bekommen hochzufahren. Villeicht kann mir ja jemand ne lösung sagen, am besten mit Beispiel weil ich noch recht Neu bin im c# Scripten.danke schonmal :)

 

void move (){	  
 myTransform = transform;
 pointA = transform.position;		   // nach knopfdruck letsStart beginnen und go.
	letsStart();
	if (starten == true)
{
 if (myTransform.position.y > pointB.position.y)
  //wenn hochgefahren und objekt erreich hat dann stehen bleiben bis--
 {
 toolate = true;
direction = 0;
StartCoroutine (justWait ());
back ();
  }
  float delta = Time.deltaTime * 60;
  myTransform.Translate(0f, direction  * speed * delta, 0f, Space.World); // automatisches hochfahren bis zur ersten if abfrage zum stehen bleiben
 }
}
void letsStart()
{
	if (mover.buttonPressed == true && toolate == false)  // wenn knopf gedrückt und nicht hochgefahren
	{
		StartCoroutine (justWaitToStart());
	}
}
public IEnumerator justWait()
{
	yield return new WaitForSeconds (obenBleiben += Random.Range(3, 10));  // plus zufällige zeit bis zum runterfahren////
 warte = true;
}
public IEnumerator justWaitToStart()
{
	yield return new WaitForSeconds(raufFahren +=Random.Range(3, 10));  // plus zufällige zeit bis zum hochfahren ALLES STARTEN LASSEN MIT starten ////
	starten = true;
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

In diesem Fall würde ich das über ein Masterscript steuern.

Deine Zielscheiben haben natürlich weiterhin ein Script, welches sie selbst hoch und runter fahren lässt. Außerdem ist in dem Script einfach eine Nummer mit bei, die der Scheibe sagt, an welchem Platz sie steht.

Das Masterscript hat ein public boolches Array mit genauso vielen Stelllen, wie Zielscheiben da sind.

Jede Zielscheibe fragt das Array ständig ab und schaut in der richtigen Stelle des Arrays (Die Stelle ergibt sich aus der eigenen Nummer) ob dort ein true oder false steht.

Wenn da True ist, dann muss die Scheibe hoch, wenn da False ist, dann muss sie runter.

 

Im Masterscript wird je nach Spiellevel einfach zufällig oder nicht die Scheibe ermittelt und dann wiederum zufällig oder nicht, ob sie hoch fahren soll oder runter muss. Also wird die entsprechende Stelle im Array mit false oder true befüllt.

 

Startbedingung ist natürlich, dass alle Stellen im Array erstmal auf false sind.

Wenn eine Scheibe runter fahren soll, nachdem sie getroffen wurde, dann muss die natürlich an das Masterscript senden, dass es so ist, damit die Stelle im Array auf false geht. Dafür kannst du ja einfach eine public void im Masterscript anlegen, in die von den Scheiben rein gesprungen wird und dabei dann einfach die Scheibennummer übermittelt wird.

Dann weiß das Masterscript, um welche Scheibe es sich dreht. Es würde dann die entsprechende Stelle im Array wieder mit false beschreiben und könnte sie für die nächsten zufälligen Aufstellungen wieder nutzen. Es könnte natürlich zusätzlich Punkte zählen und ganz viele andere Dinge machen.

 

Der Sinn hinter meiner Ausführung ist der, dass jede Scheibe für sich funktional ist, aber eben nicht selber entscheidet welchen Zustand sie haben soll. Das muss ein Spielmacher (Masterscript) entscheiden.

Nur er kennt die Regeln, die für die einzelnen Level gelten. Und nur er zeigt an, welche Scheiben denn nun was machen sollen.

Natürlich können die Scheiben dem Spielmacher ihren Zustand oder andere Ereignisse melden, aber selbst dann sagt der Spielmacher der Scheibe ob sie ihren Zustand verändern soll oder nicht. Es könnte ja sein, dass bei einem bestimmten Level die Scheibe erst nach 3 Treffern wieder runter fahren soll.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo :) erstmal vielen dank für die antwort, es klingt alles sehr logisch und auch sinnvoll. im groben versteh ich auch was du damit meinst.

 

aber in der ausführung weis ich jetz nicht wirklich wie ich das anstellen sollte. villeicht hättest du oder wer anders ja zeit mir da n beispiel zu zeigen oder am besten wär natürlich wenn man das irgendwie in mein script einbindet.

Oder einfach ein kleines beispiel script bzw 2 master und scheibenscript damit ich das auch mal verstehe :)

ich leg einfach mal den start knopf und das zielscheiben script das jede zielscheibe benutzt bei.

Hier Zielscheibe:

 

Hoffe du oder wer anders hat die gedult mit einem noob wie mir.

using UnityEngine;
using System.Collections;
public class ZielscheibeTreffer : MonoBehaviour {
[Tooltip("When hitpoints are depleted, object is destroyed.")]
public float hitPoints = 150;
private ParticleEmitter breakParticles;
private bool broken;
private Transform myTransform;
public Transform ParentItem;
public bool Hochgefahren = false;
public float points;
public float LeftPoints;
public FPSPlayer FPSPlayerComponent;
public int upTime = 5;
public float speed = 0.5f;
public bool getroffen = false;
public ButtonPress EasyButton;
public ButtonPress1 MiddleButton;
private float direction = 1.0f;
public Transform pointB;
public Transform pointC;
private Vector3 pointA;
[Tooltip("Speed of elevator movement.")]
public bool toolate = false;
public bool warte = false;
float obenBleiben = 5.0f;
float raufFahren = 2.0f;
public bool starten = false;
// public static int Range;
void Start() {
	myTransform = transform;
	pointA = transform.position;
	EasyButton = GameObject.Find("KnopfEasy").GetComponent<ButtonPress>();
	MiddleButton = GameObject.Find("KnopfMiddle").GetComponent<ButtonPress1>();
	FPSPlayerComponent = Camera.main.GetComponent<CameraControl>().playerObj.GetComponent<FPSPlayer>();
	breakParticles = myTransform.GetComponent<ParticleEmitter>();
}
IEnumerator DetectBroken() {
	while (true) {
		if (broken) {
			FadeOutDecals[] decals = gameObject.GetComponentsInChildren<FadeOutDecals>(true);
			foreach (FadeOutDecals dec in decals) {
				dec.parentObjTransform.parent = AzuObjectPool.instance.transform;
				dec.parentObj.SetActive(false);
				dec.gameObject.SetActive(false);
				//Destroy(ParentItem.gameObject);
			}
		}
		yield return new WaitForSeconds(0.1f);
	}
}
public void ApplyScore()	// die score points an den playerscript übertragen
{
	FPSPlayerComponent.scorePoints += points;
}
public void ApplyDamage(float damage)
{
	hitPoints -= damage;			// schaden und punkte zählen
	points += 1;
	EasyButton.ScheibeHochGefahren += 1;
	MiddleButton.ScheibeHochGefahren += 1;
	getroffen = true;
	ApplyScore();
	if (hitPoints <= 0 && !broken) {
		if (breakParticles) {
			breakParticles.Emit();//emit broken object particles
		}
		if (GetComponent<AudioSource>()) {
			GetComponent<AudioSource>().pitch = Random.Range(0.95f * Time.timeScale, 1.0f * Time.timeScale);
			GetComponent<AudioSource>().Play();//play break sound
		}

		myTransform.GetComponent<BoxCollider>().enabled = false;
		broken = true;
		StartCoroutine(DetectBroken());
	}
}
void move() {
	myTransform = transform;
	pointA = transform.position;				// nach knopfdruck letsStart beginnen und go.
	letsStart();
	if (starten == true)
	{
		if (myTransform.position.y > pointB.position.y && EasyButton.buttonPressed == true && MiddleButton.buttonPressed == false) //wenn hochgefahren und objekt erreich hat dann stehen bleiben bis--
		{
			toolate = true;
			direction = 0;
			StartCoroutine(justWait());
			back();
		}
		if (myTransform.position.y > pointB.position.y && MiddleButton.buttonPressed == true && EasyButton.buttonPressed == false) //wenn hochgefahren und objekt erreich hat dann stehen bleiben bis--
		{
			toolate = true;
			direction = 0;
			StartCoroutine(justWaitMiddle());
			back();
		}
		float delta = Time.deltaTime * 60;
		myTransform.Translate(0f, direction * speed * delta, 0f, Space.World); // automatisches hochfahren bis zur ersten if abfrage zum stehen bleiben
	}
}
void letsStart()
{
	if (EasyButton.buttonPressed == true && toolate == false && starten == false)  // wenn knopf gedrückt und nicht hochgefahren
	{
		if (myTransform.GetComponent<CapsuleCollider>().enabled == true)
		{
			EasyButton.ScheibeHochfahren += 1;
			myTransform.GetComponent<CapsuleCollider>().enabled = false;
			StartCoroutine(justWaitToStart());
		}
	}
	else if (MiddleButton.buttonPressed == true && toolate == false && starten == false)  // wenn knopf gedrückt und nicht hochgefahren
	{
		if (myTransform.GetComponent<CapsuleCollider>().enabled == true)
		{
			MiddleButton.ScheibeHochfahren += 1;
			myTransform.GetComponent<CapsuleCollider>().enabled = false;
			StartCoroutine(justWaitToStartMiddle());
		}
	}
}
public IEnumerator justWait()
{
	yield return new WaitForSeconds(obenBleiben += Random.Range(3, 10));  // plus zufällige zeit bis zum runterfahren////
	warte = true;
}
public IEnumerator justWaitMiddle()
{
	yield return new WaitForSeconds(Random.Range(1, 3));  // plus zufällige zeit bis zum runterfahren////
	warte = true;
}
public IEnumerator justWaitToStartMiddle()
{
	yield return new WaitForSeconds(raufFahren += Random.Range(2, 25));  // plus zufällige zeit bis zum runterfahren////
	starten = true;
	LeftPoints += 1;
	FPSPlayerComponent.leftPoints -= LeftPoints;
}
public IEnumerator justWaitToStart()
{
	yield return new WaitForSeconds(raufFahren += Random.Range(5, 30));  // plus zufällige zeit bis zum hochfahren ALLES STARTEN LASSEN MIT starten ////
	starten = true;
	LeftPoints += 1;
	FPSPlayerComponent.leftPoints -= LeftPoints;
}
void bremse()
{
	if (myTransform.position.y <= pointC.position.y) {
		direction = 0;		 // beim nach unten fahren richtig stehen bleiben
		if (Hochgefahren == true)
		{
			if (myTransform.GetComponent<BoxCollider>().enabled == true)
			{
				EasyButton.ScheibeHochGefahren += 1;
				MiddleButton.ScheibeHochGefahren += 1;
				myTransform.GetComponent<BoxCollider>().enabled = false;
				starten = false;
			}
		}
	}
}
void treffer()
{
	if (getroffen == true) {		// bei treffer runterfahren
		back();
	}
}
void back()
{
	if (myTransform.position.y > pointB.position.y && toolate == true && warte == true || getroffen == true) {		// runterfahren
		direction = -1;
		bremse();
		Hochgefahren = true;
	}
}
void Update()
{
	treffer();
	move();
	bremse();
}

Hier Knopf zum starten:

using UnityEngine;
using System.Collections;
public class ButtonPress : MonoBehaviour
{
private GameObject playerObj;
private InputControl InputComponent;
//public ZielscheibenBewegung mover;
public bool warte = false;
public bool buttonPressed = false;
public int ScheibeHochGefahren = 0;
public int ScheibeHochfahren = 0;
public Transform easyText;
public ButtonPress1 MiddleButton;
void Start ()
{
	//mover =  GameObject.Find("ZielscheibeMover").GetComponent<ZielscheibenBewegung>();
	playerObj = Camera.main.transform.GetComponent<CameraControl>().playerObj;
 InputComponent = playerObj.GetComponent<InputControl>();
	MiddleButton = GameObject.Find("KnopfMiddle").GetComponent<ButtonPress1>();
}
void Update()
{
	textClose();
}
void OnTriggerStay ( Collider other )
{
 if(other.gameObject.tag == "Player" && InputComponent.usePress && buttonPressed == false && ScheibeHochGefahren <=14 && MiddleButton.buttonPressed == false)
 {
  var animator = gameObject.GetComponent<Animator>();
  animator.SetBool("gedruckt",true);
  StartCoroutine (justWait1 ());
		buttonPressed = false;
		//mover.buttonPressed = true;
		//animator.SetBool("gedruckt",false);
	}
}
void textClose()
{
	if (ScheibeHochGefahren >= 15)
	{
		buttonPressed = false;
		StartCoroutine(justWait());
	}
}
public IEnumerator justWait()
{

	yield return new WaitForSeconds(2);
	warte = false;
	easyText.gameObject.SetActive(false);
}
public IEnumerator justWait1()
{
	var animator = gameObject.GetComponent<Animator>();
	yield return new WaitForSeconds (2.0f);
 warte = true;
 //mover.buttonPressed = true;
 buttonPressed = true;
	animator.SetBool("gedruckt", false);
	easyText.gameObject.SetActive(true);
}
void OnTriggerExit ( Collider other2  ){
 if(other2.gameObject.tag == "Player")
 {
  //mover.buttonPressed = false;
  //buttonPressed = false;
 }
}
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay habs jetz über einen " gameMaster object mit script versucht. bzw bin gerade dabei.

 

also das er jetzt random eine von der zielscheibe auswählt funktioniert bereits aber ich kann nicht auf das script des gameobjektes zugreifen.

 

soll heisen ich würde gerne von meinen gm script auf die zufällig ausgewählte zielscheibe dessen script zugreifen und etwas abfragen.

 

kann mir wer da aus der klemme helfen?

 

public GameObject[] Zielscheibe;
public GameObject currentScheibe;
public ButtonPress EasyButton;
public ButtonPress1 MiddleButton;
public bool letsDoIt = false;
int index;

// Use this for initialization
void Start () {
	EasyButton = GameObject.Find("KnopfEasy").GetComponent<ButtonPress>();
	MiddleButton = GameObject.Find("KnopfMiddle").GetComponent<ButtonPress1>();
	chooseScheibe();
}

void chooseScheibe()
{
	index = Random.Range(0, Zielscheibe.Length);
	currentScheibe = Zielscheibe[index];
	print(currentScheibe.name);
	test = currentScheibe.GetComponent<ZielscheibeTreffer>();  // Hier stecke ich fest _(
	if (currentScheibe.test.starten == true)								    // das funktioniert nicht nur fehlermeldung
	{  
		return;
	}
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Neee! dafür braucht man keine statischen Variablen. man muss nur das Gameobjekt mit dem Script kennen und die Variable muss public sein.

Da es aber recht aufwendig ist, von einem Objekt auf 12 andere zuzugreifen, sollte man es umgekehrt machen. Die 12 anderen Objekte greifen auf das eine Masterobjekt zu.

Um es zu finden bietet sich ein Tag an.

 

Im Zielscheibenscript:

 


private  masterscript master;  // masterscript ist das gesuchte Script auf dem Master. kann natürlich anders heissen.
public meineNummer =0; // diese Nummer kannst du im Inspector für jede Scheibe ändern.

void Start(){
  master=gameObject.FindWithTag("Master").GetComponent<masterscript>();  // hier wird das Gameobject über den Tag gesucht und das script zur referenz gemacht
}


void Update(){
  //wenn irgendwas ist dann beschreibe z.B. eine Public Variable im master
  master.zielscheibeGetroffen[meineNummer] =true; // direkt einen Wert ins Array an eintsprechender Stelle rein schreiben
  // oder aber springe in eine public Funktion und sag es so dem Master
  master.Getroffen(meineNummer);  // hier wird in eine Void im Master rein gesprungen und der Master nutzt den Wert, der übergeben wurde


Hier die Funktion im Masterscript

 

void Getroffen(int nummer){
  zielscheibeGetroffen[nummer]=true;
}

 

 

Das mit dem Array im Master ist ja nur ein Beispiel. Es soll nur zeigen, dass man eben Werte übergeben bzw. direkt beschreiben kann.

Alles ohne Statc.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...