Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by Dreave · Nov 14, 2011 at 07:28 PM · raycast

RayCast Loop?

I have two scripts for my enemy's health one which takes damage off, and the actual enemy's health, but it only takes damage off when I click the mouse button over and over where as I want it to take damage off when the LMB is held down because I have a machine gun. How would I change these scripts to do so?

Enemy Damage:

 function Update(){

 if (Input.GetButtonDown("Fire1")){

     Shoot();

 }

}

var shotSound: AudioClip;

var bloodPrefab: GameObject;

var sparksPrefab: GameObject;

function Shoot(){

 if (shotSound) audio.PlayOneShot(shotSound); 

 var hit: RaycastHit;

 if (Physics.Raycast(transform.position, transform.forward, hit)){

     

     var rot = Quaternion.FromToRotation(Vector3.up, hit.normal);

     if (hit.transform.tag == "Enemy"){ 

         if (bloodPrefab) Instantiate(bloodPrefab, hit.point, rot); 

         hit.transform.SendMessage("ApplyDamage", 20, SendMessageOptions.DontRequireReceiver); 

     } else { 

         if (sparksPrefab) Instantiate(sparksPrefab, hit.point, rot);

     }

 }

}

Enemy's Health:

 var health = 100;



function ApplyDamage(damage: int){

 health -= damage;

 if (health <= 0){

     Destroy (gameObject);

 }

}

Comment
Add comment · Show 1
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Eric5h5 · Nov 14, 2011 at 07:33 PM 0
Share

Please format code properly by selecting it and using the code button.

2 Replies

· Add your reply
  • Sort: 
avatar image
1
Best Answer

Answer by WillTAtl · Nov 14, 2011 at 07:48 PM

GetButtonDown returns true only the first update after it is pressed, as you noticed already. You could just change "GetButtonDown" to "GetButton," which returns true every update that the button is still held down, but this would mean firing every single frame, which might not be what you want, and you'd have no way to tweak the fire rate, for example if you implemented multiple machine guns.

A better approach would be to use a coroutine, like so...

//Adding a variable you can configure in the inspector to adjust the rounds fired //per second var shotsPerSecond: float=15;

function Update() { //if the fire button was just pressed this frame... if (Input.GetButtonDown("Fire1")) { //launch Shoot() as a coroutine... StartCoroutine("Shoot"); } //if the fire button was just released... if (Input.GetButtonUp("Fire1")) { //stop the coroutine, so we'll stop firing StopCoroutine("Shoot"); } }

//slight mods to modify the shoot function to repeat with a delay function Shoot() { //loop forever... we'll end when StopCoroutine is called in Update() while(true) { / put all of your original shoot code here /

     //this causes the function to suspend for 
     //some time before repeating the loop.
     yield WaitForSeconds(1/shotsPerSecond);

     //we're using 1/shotsPerSecond to convert shots-per-second into 
     //the seconds between shots. you could avoid the division by 
     //changing the var to fireDelay, but 15 shotsPerSecond is easier
     //to understand in human terms than a fireDelay of 0.0666666667, 
     //at least in my opinion, and the performance cost is minimal.
 } //end while

}

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image
1

Answer by Ludiares.du · Nov 14, 2011 at 07:48 PM

Instead of using GetButtonDown, use GetButton, and use some delay system so it doesn't shoot every frame.

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

5 People are following this question.

avatar image avatar image avatar image avatar image avatar image

Related Questions

C# More Accurate or Larger Raycast 1 Answer

The name 'Joystick' does not denote a valid type ('not found') 2 Answers

Ray Casting Tutorial? 3 Answers

RayCast Delay? 1 Answer

Raycast Help 1 Answer


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges