Unity3d ako správne odpočítavať timer vo WayPoint – JavaScript, AJAX, jQuery – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Unity3d ako správne odpočítavať timer vo WayPoint – JavaScript, AJAX, jQuery – Fórum – Programujte.comUnity3d ako správne odpočítavať timer vo WayPoint – JavaScript, AJAX, jQuery – Fórum – Programujte.com

 

Vlákno bylo úspěšně vloženo.
Pokud sám přijdeš na řešení, nezapomeň ho sem přidat!
juraj1750
Návštěvník
15. 5. 2018   #1
-
0
-

Ako upraviť kód kde sa postava  zastaví pri bode 3 napr na 9 sekúnd a po uplinutí času by sa mala pohnúť.
Hodnotu načíta 9s Ale nechce správne odpočitávať timer -= Time.deltaTime; tu je kód

 Problematická časť kódu je vyznačená tučným písmom. Ďakujem za rady

#pragma strict

 public var wayPoints : Transform[];
 var enemy:  GameObject;
var player:  GameObject;
public var vehicleSpeed : float;
public var curWayPoint : int;
public var turningSpeed : float;
public var doPatrol : boolean = true;
public var target : Vector3;
public var moveDirection : Vector3;
public var Velocity : Vector3;
 var minvzdialenostsledovania :float=3;
 var moveSpeed :float=3;
 
private var animator:Animator;
var idleAnimation:AnimationClip;
var walkAnimation:AnimationClip;
var attackAnimation:AnimationClip;
var diem:AnimationClip;
var rb: Rigidbody;
private var nav:NavMeshAgent;

var stop:boolean= true;
public var timer:float;
function Start()
{
var animation : Animation;
animator=GetComponent(Animator);
rb = GetComponent.<Rigidbody>();

}
function Update()
{ 
var distance = Vector3.Distance(enemy.transform.position, player.transform.position);
Debug.Log(distance);

	if(distance>=3 && distance<=4  ){
	Debug.Log("pozoruje"+distance);
 lookAtPlayer();
rb.velocity=Vector3.zero;
GetComponent.<Animation>().Play("Idle_02");  
GetComponent.<Animation>().Stop("Walk");
}else if(distance>4){
Debug.Log("strazi objekt"+distance +"bod"+curWayPoint);

	/*tu sa otoci*/
	rigidbody.rotation = Quaternion.Slerp(enemy.transform.rotation,Quaternion.LookRotation(-moveDirection),turningSpeed * Time.deltaTime);	

Waipointss();

}
	 if(distance<=3){    
GetComponent.<Animation>().Play("Walk");
GetComponent.<Animation>().Stop("Idle_02");  
  
Debug.Log("prenasleduje"+distance);
 enemy.transform.position += enemy.transform.forward * 1 * Time.deltaTime;
  lookAtPlayer();
}else{
	//Waipointss();
	}
	}

function Waipointss(){

if(curWayPoint < wayPoints.Length)
	{
		target = wayPoints[curWayPoint].position;
		moveDirection = target - enemy.transform.position;
		Velocity = rigidbody.velocity;
		
		if(moveDirection.magnitude < 1)
		{
			curWayPoint++;
		}
		else
		{
	Velocity = moveDirection.normalized * vehicleSpeed;
	}		
	}
	else
	{
		if(doPatrol)
		{
			curWayPoint = 0;			
		}
		else
		{
			Velocity = Vector3.zero;
		}
	}
	rigidbody.velocity = Velocity;

	/*tu sa otoci*/
	rigidbody.rotation = Quaternion.Slerp(enemy.transform.rotation,Quaternion.LookRotation(moveDirection),turningSpeed * Time.deltaTime);	

if(curWayPoint==3){ 

timer = 9.0;
    if (timer <= 0) {
timer -= Time.deltaTime;
        //We only need to update the text if the score changed.
GetComponent.<Animation>().Play("Walk");
        //Reset the timer to 0.
      timer = 0.0;      
    }else{

Debug.Log("timer"+timer);

GetComponent.<Animation>().Stop("Walk");
GetComponent.<Animation>().Play("Idle_02"); 
rb.velocity=Vector3.zero; 
Debug.Log("cas"+timer);
}

}

GetComponent.<Animation>().Play("Walk");
}
	function lookAtPlayer(){
	   var relativePos =   player.transform.position-enemy.transform.position ;
        var rotation = Quaternion.LookRotation(relativePos);
           enemy.transform.rotation = rotation;
  	}



Nahlásit jako SPAM
IP: 88.212.36.–
MilanL+1
Grafoman
15. 5. 2018   #2
-
0
-

ahoj,

jako obvykle máš nastavení hodnoty na špatným místě, v podstatě pokud jsi na WP 3, tak se tam zastavíš natrvalo - bo pokaždé ten čas nejdřív nastavíš a pak porovnáváš, takže  máš pokaždé stejnou situaci. Navíc jestli dobře čtu program ta by ses měl zastavit na WP2 a ne 3, bo když dojdeš do bodu, tak v té funkci nejdřív posuneš na další WP a až pak kontroluješ Timer.

zkus nastavení timeru dát do podmínky

if (moveDirection.magnitude < 1) {
. . if(curWayPoint==3) timer = 9.0;
. . curWayPoint++;
}
 

v tý další části tu vnější podmínku WP==3 a nastavení timeru na 9s zruš a nech jen tu část s if(timer<=0)

 

Nahlásit jako SPAM
IP: 91.139.9.–
juraj1750
Návštěvník
15. 5. 2018   #3
-
0
-

#2 MilanL
a ako to mám opraviť aby to správne fungovalo?

Nahlásit jako SPAM
IP: 88.212.36.–
MilanL+1
Grafoman
15. 5. 2018   #4
-
0
-

#3 juraj175
EDIT původního

Nahlásit jako SPAM
IP: 91.139.9.–
MilanL+1
Grafoman
15. 5. 2018   #5
-
0
-

#3 juraj175
Ty stavy pro daný WP musíš nastavovat tam, kde zjišťuješ, že jsi na něj došel.

Nahlásit jako SPAM
IP: 91.139.9.–
juraj1750
Návštěvník
15. 5. 2018   #6
-
0
-

#5 MilanL
Vdaka funguje,nevšimol som si kod

if (moveDirection.magnitude < 1) {
 if(curWayPoint==3) timer = 9.0;
 curWayPoint++;
}
 

Nahlásit jako SPAM
IP: 88.212.36.–
peter
~ Anonymní uživatel
3981 příspěvků
15. 5. 2018   #7
-
0
-

 Ja bych si to napsal nejak takto, kdyby slo o javascript. Prijde mi, ze celkem michas dokupy samotny pohyb, animace s questy, jako je hlidkovani a pod.

postava = {};
postava.name = "juraj175"
postava.speed = 1
postava.pozice = {x:0, y:0};
postava.quest = [];
postava.quest[0] = false; // mysleno tak, ze quest jeste nemam splneny
postava.questOpened = null
postava.questTime = null;

function nextStep()
{
// questy
if (postava.questTime>0)
  {
  postava.questTime--;
  if (postava.questTime==0)
     {questClose(postava, postava.questOpened);}
  return;
}
// pohyb
presunXY();
// koize s objekty na mape
if (postava.pozice.x=objekt[0].pozice.x && postava.pozice.y=objekt[0].pozice.y && postava.quest[0]=false)
  {questOpen(postava,0);}
}

function questOpen(postava,id)
{
if (id == 0)
  {
  postava.questOpened = id;
  postava.questTime = 5;
  }
}

function questClose(postava,id)
{
postava.questOpened = null;
postava.questTime = 0;
if (id == 0)
  {
  postava.odmena++
  }
}


setTimeout(nextStep,300);	// nastaveni casovace v js, opakuje kazdych 300ms funkci nextStep
Nahlásit jako SPAM
IP: 2001:718:2601:258:8cd1:96...–
MilanL+1
Grafoman
15. 5. 2018   #8
-
0
-

#7 peter
taky bych to osobně řešil jinak, ale už jsem si zvykl, že každej si to dělá po svým.

Juraj obvykle jen špatně umisťuje, jako by mu chyběla představivost co ten kod, kdy vlastně dělá, jaké jsou v daných okamžicích stavy proměnných.

Nahlásit jako SPAM
IP: 91.139.9.–
juraj1750
Návštěvník
15. 5. 2018   #9
-
0
-

#8 MilanL

Asi,tak nejako keď som v programovaní samouk, a nemá mi kto to poriadne vysvetliť,ale pomaly na to prídem aj s vašou pomocou

Nahlásit jako SPAM
IP: 88.212.36.–
peter
~ Anonymní uživatel
3981 příspěvků
15. 5. 2018   #10
-
0
-

Tak, muj kod vypada nekdy podobne :) Taky si zacinam zvykat na jakysi poradek, strukturu. Hodne k tomu pomahaji class, ktere si obcas vygoogluji, kdyz hledam nejaky problem. V ramci class resi jeden ukol. Ono to pak zvysuje prehlednost a logiku.
Cili, nemichat misto, kde resim eventy, polohu a questy fo jedne funkce. Proto jsem ten kod napsal.  Neni to mysleno jako kritika. Tam pak vim, ze veci tykajici se postavy se resi pres promennou postava. Ze timer, ktery resi quest, bude u questu a ne jako jakysi globalni time. mozna bych tam udelal jeste jednu zmenu :)

postava.quest = [];
postava.quest[0] = false; // mysleno tak, ze quest jeste nemam splneny
postava.questOpened = null
postava.questTime = null;
---
postava.questy = [];
postava.questy[0] = false; // false nebo null, typeof 'undefined' (v js)
postava.quest = null; // nebo {id:123, time: 456};

Cili, sleduji, ktere questy ma hotove posle toho, zda tam ma true. A pokud ma guest!=null. U hry jako Wow pak muzes mit nekolik questu najednou s ruznymi parametry (neprijemne ve Wow jsou s omezenym casem). Daily questy, ktere je mozne udelat jednou za den, treba.

Nahlásit jako SPAM
IP: 2001:718:2601:258:8cd1:96...–
juraj1750
Návštěvník
15. 5. 2018   #11
-
0
-

Ešte mám otázku. Ako prehrať animačný klip len raz, aby sa stále neopakoval?

GetComponent.<Animation>().Play("Die");

Animačná klip

Add Loop Frame je odškrtnuté

Wrap Mode je once

a typ animácie je Legacy.

A dá sa klip prekopírovať do prefab?

Nahlásit jako SPAM
IP: 88.212.36.–
juraj1750
Návštěvník
23. 5. 2018   #12
-
0
-

#9 juraj175
Tu mám kód,že keď bude mať nula akože životov,tak sa mi nechce prehrať animačný klip  Die

 var health : float = 3;

function Start () {
var animation : Animation;
animator=GetComponent(Animator);
}


function OnCollisionEnter(col:Collision) {


if(col.gameObject.name == "projektile(Clone)"  ){

//Destroy(gameObject);

         
                  if( health == 0 )
             {
     //animation.CrossFade("Die");

  animation["Die"].wrapMode = WrapMode.ClampForever;
animation.CrossFade("Die");


}else{
GetComponent.<Animation>().Play("Walk");
 health--;
 Debug.Log("zije"+ health);
         }
 


}
}

Nahlásit jako SPAM
IP: 88.212.36.–
MilanL+1
Grafoman
23. 5. 2018   #13
-
0
-

#13 juraj175
hm nevim ale nemůže to být tím, že object animation máš v jiné funkci než přiřazovanou animaci, skus ten var z funkce start přesunout do globalu.

Nahlásit jako SPAM
IP: 91.139.9.–
juraj1750
Návštěvník
23. 5. 2018   #14
-
0
-

#14 MilanL
tu je spravny kod

function Update () {


 distance = Vector3.Distance(enemy.transform.position, player.transform.position);
 if( health == 0 ){
  animation["Die"].wrapMode = WrapMode.ClampForever;
animation.CrossFade("Die");
 }else{

Waipointss();}
}

lebo animacne klipy do funkcie OnCollisionEnter podla mna nepatria a funguje

Nahlásit jako SPAM
IP: 88.212.36.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý