Jump to content
Unity Insider Forum

Feste Distanz zum Player einstellen


kevios105

Recommended Posts

Hallo erst einmal,
ich bin ziemlich neu in Unity und habe hier ein Script wo ich einfach nicht eine feste Distanz zwischen Follower und Player hinbekomme...

Das Script soll folgendes einfach machen:
Player folgen und eine gewisse Distanz zum Spieler immer einhalten und wenn der Player sich nicht bewegt soll der "Follower" automatisch in die "Idle" Animation gehen und nicht weiter laufen bis der Player sich wieder bewegt...

Ganz am ende soll es ein "Follower Pet" sein bzw. ein Begleiter der aber auch Gegner die sich in einer gewissen Distanz befinden automatisch attackieren.
Aber soweit komme ich gerade noch nicht wegen eben dieser Distanz...

Ich bin wirklich sehr neu in Unity und in C++ sowie JS aber ich gebe mein bestes aber ich bin echt am verzweifeln >.< 

Wenn mir einer bitte helfen könnte wäre ich sehr dankbar und natürlich würde ich mich auch freuen wenn jemand das mit dem Automatischen Attackieren wenn ein Gegner in Range ist auch mir zeigen könnte aber das ist kein "muss" ... ich werde es auch selbst irgendwie dann hinbekommen (hoffe ich doch ^^)...

Vielen dank für jede Hilfe!

hier das Script was ich bisher habe:

var Player : Transform; 
var moveSpeed = 3; //move speed
var rotationSpeed = 3; //speed of turning

var myTransform : Transform; 
var ragdoll : GameObject;
var agent : UnityEngine.AI.NavMeshAgent;//current transform data of this enemy
var isNotDead : boolean = true;
var health : float = 100;
var distance : float = 3.0f;

function Awake()
{
    myTransform = transform; //cache transform data for easy access/preformance
}

function Start()
{
      agent = GetComponent.<UnityEngine.AI.NavMeshAgent>();
}

function Update () {

	if(health < 1){
	
		isNotDead = false;
		Destroy(gameObject);
		Instantiate (ragdoll, myTransform.position, myTransform.rotation);
	}
	
	if(isNotDead){
	
	    //rotate to look at the player

	    
	    var distance = Vector3.Distance(Player.position, myTransform.position) ;
	    if (distance < 1.0f) {
	        GetComponent.<Animator>().Play("Idle");
	    }
	    else{   
	    	//move towards the player
	   		agent.SetDestination(Player.position);
	   		GetComponent.<Animator>().Play("Walk");
	   		myTransform.rotation = Quaternion.Slerp(myTransform.rotation,
	    Quaternion.LookRotation(Player.position - myTransform.position), rotationSpeed*Time.deltaTime);
	
	    }

	}
}


 function OnTriggerEnter(collider : Collider)
 {
     if(collider.tag == "Player")
     {
     GetComponent.<Animator>().Play("sound");
     GetComponent.<AudioSource>().Play();
     yield WaitForSeconds (2);
       Player = GameObject.FindWithTag("Player").transform;  
     }
 }



function ApplyDamage(dmg : float){

	health -= 20;

}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde es mal so probieren. Ist aber ungetestet (Unity 2017). Ist aber aktuell nur für einen maximalen Abstand, d.h. der Begleiter geht nicht auf Abstand, wenn der Spieler zu nah kommt.

var followDistance : float = 10f;
            var distance = Vector3.Distance(Player.position, myTransform.position) ;
	    if (distance < followDistance) {
                agent.isStopped = true;
	        GetComponent.<Animator>().Play("Idle");
	    }
	    else{   
	    	//move towards the player
                agent.isStopped = false;
	   	agent.SetDestination(Player.position);
	   	GetComponent.<Animator>().Play("Walk");
	   	myTransform.rotation = Quaternion.Slerp(myTransform.rotation,
 	        Quaternion.LookRotation(Player.position - myTransform.position), rotationSpeed*Time.deltaTime);
	
	    }

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielen Dank erst einmal für die schnell Antwort! :)

Ich habe es natürlich gleich ausprobiert leider bekomme ich nun diesen Fehler in der Console angezeigt:

Assets/Petfollow.js(39,17): BCE0005: Unknown identifier: 'NavMeshAgent'.

Ich schätze mal das ich NavMeshAgent erst definieren muss? Wenn ja wie?

 

// Edit habe das nun so versucht 

UnityEngine.AI.NavMeshAgent

anstatt das

NavMeshAgent

und nun bekomme ich zwar keinen Fehler direkt angezeigt in der Console aber das "Pet" folgt mir nun auch nicht mehr egal was für eine Distanzgröße ich eingebe, wenn ich ihm aber dann zu nahe komme, bekomme ich folgenden Fehler in der Console angezeigt

MissingFieldException: UnityEngine.AI.NavMeshAgent.isStopped
Boo.Lang.Runtime.DynamicDispatching.PropertyDispatcherFactory.FindExtension (IEnumerable`1 candidates)
Boo.Lang.Runtime.DynamicDispatching.PropertyDispatcherFactory.Create (SetOrGet gos)
Boo.Lang.Runtime.DynamicDispatching.PropertyDispatcherFactory.CreateSetter ()
Boo.Lang.Runtime.RuntimeServices.DoCreatePropSetDispatcher (System.Object target, System.Type type, System.String name, System.Object value)
Boo.Lang.Runtime.RuntimeServices.CreatePropSetDispatcher (System.Object target, System.String name, System.Object value)
Boo.Lang.Runtime.RuntimeServices+<SetProperty>c__AnonStorey19.<>m__F ()
Boo.Lang.Runtime.DynamicDispatching.DispatcherCache.Get (Boo.Lang.Runtime.DynamicDispatching.DispatcherKey key, Boo.Lang.Runtime.DynamicDispatching.DispatcherFactory factory)
Boo.Lang.Runtime.RuntimeServices.GetDispatcher (System.Object target, System.String cacheKeyName, System.Type[] cacheKeyTypes, Boo.Lang.Runtime.DynamicDispatching.DispatcherFactory factory)
Boo.Lang.Runtime.RuntimeServices.GetDispatcher (System.Object target, System.Object[] args, System.String cacheKeyName, Boo.Lang.Runtime.DynamicDispatching.DispatcherFactory factory)
Boo.Lang.Runtime.RuntimeServices.SetProperty (System.Object target, System.String name, System.Object value)
Petfollow.Update () (at Assets/Petfollow.js:39)

Bin da jetzt total überfordert um ehrlich zu sein mit dem Fehler o.O

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...