2015-08-28 55 views
0

我对Unity 5完全陌生,在使用教程中的代码拍摄枪时遇到问题。这里是我的代码:Unity中单击按钮时发生太多事件(使用鼠标单击复制子弹时)

static var ammo = 30; 

var key : String = "mouse 0"; 

var speed : float = 100; 

static var maxAmmo = 30; 

var bullet : Rigidbody; 

var dmg : float = 20; 


function Update() 
{ 
    if(Input.GetKeyDown(key)){ 

     if(ammo > 0){ 

      Shoot(); 
     } 
    } 
} 

function Shoot() { 
    var bullet1 : Rigidbody = Instantiate(bullet, transform.position, transform.rotation); 
    bullet1.AddForce(transform.forward * speed); 
    ammo --; 
} 

function OnGUI(){ 
    GUI.Label(Rect(10,10,500,500), ""+ammo); 
} 

function OnTriggerEnter(hit:Collider){ 
    if(hit.tag == "Enemy"){ 
     hit.transform.SendMessage("Damage",dmg); 
    } 
} 

当我运行这段代码,子弹的克隆出现数倍(甚至高达8发子弹出现几乎瞬间),来说明:

首先点击 - >子弹(克隆)

下一页点击 - >子弹(克隆),子弹(克隆)(克隆)

下一个点击 - >子弹(克隆),子弹(克隆)(克隆),子弹(克隆)(克隆)(克隆)

任何人都可以帮忙吗?谢谢

+0

为了澄清,您是否希望用鼠标单击来触发多个镜头,但速度较低,或者每次点击鼠标只触发一颗子弹? – Serlite

+0

你是说第一次点击就得到一颗子弹,第二次点击得到两颗子弹等等? – user3071284

+0

我只需要每次点击一次。 – Luke

回答

0

嗯看起来应该工作,但我从来没有听说过“鼠标0”作为键码。

试试这个

static var ammo = 30; 

var mouse : int = 0; 

var speed : float = 100; 

static var maxAmmo = 30; 

var bullet : Rigidbody; 

var dmg : float = 20; 


function Update() 
{ 
    if(Input.GetMousebuttonDown(mouse) && ammo > 0) 
     Shoot(); 
} 

function Shoot() { 
    var bullet1 : Rigidbody = Instantiate(bullet, transform.position, transform.rotation); 
    bullet1.AddForce(transform.forward * speed); 
    ammo --; 
} 

function OnGUI(){ 
    GUI.Label(Rect(10,10,500,500), ""+ammo); 
} 

function OnTriggerEnter(hit:Collider){ 
    if(hit.tag == "Enemy"){ 
     hit.transform.SendMessage("Damage",dmg); 
    } 
} 
+0

是的,不错的代码,但子弹射击量从1,2,4,8,16等讨厌它。也许它不是代码? – Luke

+0

我只想每次都拍一拍 – Luke

0

好了,问题是,你是不是“等待”前执行下一次拍摄。 Update函数将在每秒钟被调用几次。所以,你可以拍摄,举起一个标志(iMShooting = true;),然后用协程在X秒后解锁标志。 此外,您的标志iMShooting添加到您的更新功能。

var iMShooting : boolean = false; 

function Update() 
{ 
    if(Input.GetKeyDown(key) && ! iMShooting){ 

     if(ammo > 0){ 

     Shoot(); 
     } 
    } 
} 

function Shoot() { 
    iMShooting = true; 
    var bullet1 : Rigidbody = Instantiate(bullet, transform.position, transform.rotation); 
    bullet1.AddForce(transform.forward * speed); 
    ammo --; 
    StartCoroutine(shootingDone()); 

} 

你的协同程序应该是这样的:

function shootingDone() 
{ 
    var waitTime : float = 0.5f; 
    yield WaitForSeconds (waitTime); 
    iMShooting = false; 
} 
+0

这不应该是必须的。 [根据文档,'GetKeyDown'](http://docs.unity3d.com/ScriptReference/Input.GetKeyDown.html)仅对按下按键的框架有效。 – 31eee384

+0

哦,你是对的!一方面,国旗会避免额外的射击,但另一方面不是正确的答案。 – mayo

+0

弹药去29,27,23,15,0 – Luke

0

谢谢大家的帮助,但我实现了子弹的副本从子弹产卵自己,我意识到我把射击脚本放在子弹上,所以子弹本身就像枪支一样。我已经删除了脚本,它完美的工作。谢谢您的帮助!