Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
2 captures
12 Jun 22 - 14 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 /
  • Help Room /
avatar image
0
Question by Absinthe23 · Apr 03, 2016 at 02:28 PM · scripting problemreferenceinheritancedynamicderived-class

Get reference to dynamically added script

I have a base class called Weapon and several derived classes e.g. Weapon_Rifle, Weapon_Pistol etc.

In another class I need to reference whatever derived class of Weapon exists on the GameObject in question. In pseduocode what I'm trying to do is this:

 public class OtherClass : MonoBehaviour
 {
 
      public string weaponType;
      public SCRIPT_I_WANT_TO_REFERENCE;
 
      void Awake(){
           if(weaponType =="Rifle"){
                SCRIPT_I_WANT_TO_REFERENCE = GetComponent<Weapon_Rifle>();
           } else {
               SCRIPT_I_WANT_TO_REFERENCE = GetComponent<Weapon_Pistol>(); // etc etc
           }
      }

      void DoStuff(){
           SCRIPT_I_WANT_TO_REFERENCE.ShootWeapon();
      }
 }

Trouble is of course I can't use a dummy type like Object for the SCRIPT_I_WANT_TO_REFERENCE as the compiler complains where I try to access methods of that script like ShootWeapon().

Any way this can be done?

Many thanks.

Comment
Add comment · Show 2
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 Fredex8 · Apr 03, 2016 at 03:05 PM 0
Share

I tried to do this a while ago, looked everywhere and either found no answers or solutions far too complicated to be worth while.

The best idea is probably to have an additional class on the rifle, pistol etc called just Weapon so you can always access values within that by name without a problem. Then and can access values from the Weapon script on them when they need too or Weapon can send variables to them.

avatar image Absinthe23 Fredex8 · Apr 03, 2016 at 08:30 PM 0
Share

Thanks. Yeah that's probably the simplest approach, though I have lots of different weapons so managing code would get quite tricky after a while ;) I've started to implement the suggestion made in answer to your linked post - an interface - not too hard to do & it's working quite well so far.

1 Reply

· Add your reply
  • Sort: 
avatar image
0

Answer by IgorAherne · Apr 03, 2016 at 05:39 PM

use dummy type like Object, but when you use it, cast it into the required script type.

 public Object SCRIPT_I_WANT_TO_REFERENCE;
 
  if(weaponType =="Rifle"){
                 SCRIPT_I_WANT_TO_REFERENCE = (Object)GetComponent<Weapon_Rifle>();
            } else {
                SCRIPT_I_WANT_TO_REFERENCE = (Object)GetComponent<Weapon_Pistol>(); // etc etc
            }
 
  void DoStuff(){
            ((Weapon_Pistol)SCRIPT_I_WANT_TO_REFERENCE).ShootWeapon();
       }
Comment
Add comment · Show 2 · 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 Absinthe23 · Apr 03, 2016 at 08:26 PM 0
Share

Thanks. Do you think there is much of a performance hit with the casting? Since it's a shooting script for an action game the methods will get called very frequently.

avatar image IgorAherne · Apr 03, 2016 at 09:17 PM 0
Share

absolutely no performance hit ) It's totally negligible when compared with things like GetComponent performance.

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

4 People are following this question.

avatar image avatar image avatar image avatar image

Related Questions

MonoDevelop Unity API reference function with wrong path. How to Fix it? 1 Answer

Recursive SetParent not working 1 Answer

Waring, using new keyword on monovehaviour. When im not using monobehaviour!? 1 Answer

How to Fix this issue 1 Answer

Script execution order of child and parent classes - Parent then children??? 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