• 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 Shawn Miller · Jan 31, 2012 at 06:11 PM · c#castingcs0246

Issue casting using Type variable? C#

I am receiving error CS0246: "The type or namespace name 't' could not be found. Are you missing a using directive or an assembly reference?" on the following code and I can't figure out why.

 using UnityEngine;
 using System;
 using System.Collections;
 
 public class EventController : MonoBehaviour {
     public string[] scripts;
     
     void OnTriggerEnter(Collider c) {
         if(c.tag == "Player") {
             for (int i=0; i < scripts.Length; i++) {
                 UnityEngine.Object s = gameObject.GetComponent(scripts[i]);
                 Type t = Type.GetType(scripts[i]);
                 ((t)s).Run(); // This is the error line.
             }
         }
     }
 }
Comment
Add comment
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

2 Replies

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

Answer by Bunny83 · Jan 31, 2012 at 06:45 PM

This doesn't work the way you do it here. System.Type is part of the runtime type information system. It's a special class that describe a certain type. .NET / Mono is a compiled language so it's impossible to compile your code above since the t is not a type, it's a class instance which holds the descriptor of a certain type.

If all those different scripts have a function Run() you should implement an interface in al those types.

Another way would be to use reflection, but it's kinda slow, messy programming style and hard to debug.

edit
Here's an example how to use an interface:

public interface IRunable { void Run(); }

public class SomeScript : MonoBehaviour, IRunable { void Update() { // ... }

 // This is the interface function. Because we derived our class from IRunable,
 // this class must implement the Run() method.
 public void Run()
 {
 }

}

// In your triggering class: void OnTriggerEnter(Collider c) { if(c.tag == "Player") { IRunable[] scripts = (IRunable[])gameObject.GetComponents(typeof(IRunable)); foreach (IRunable s in scripts) { s.Run(); } } }

Here's an example how to use Unity's SendMessage:

void OnTriggerEnter(Collider c)
{
    if(c.tag == "Player")
    {
        SendMessage("Run");
    }
}

And finally a Reflection approach:

void OnTriggerEnter(Collider c)
{
    if(c.tag == "Player")
    {
        for (int i=0; i < scripts.Length; i++)
        {
            MonoBehaviour s = gameObject.GetComponent(scripts[i]);
            Type t = s.GetType();
            System.Reflection.MethodInfo MI = t.GetMethod("Run");
            MI.Invoke(s);
        }
    }
}

Of course you should check all those things against "null". If the desired script isn't attached to the object, GetComponent will return null so accessing "s" afterwards yields to a null-ref-exception. If the script type doesn't have a method called "Run", GetMethod will also return null.

Comment
Add comment · Show 1 · 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 Shawn Miller · Jan 31, 2012 at 09:05 PM 0
Share

Huh, I could have sworn I've done it this way on another program, guess I'm losing my $$anonymous$$d. In any case, thank you for the response and the demonstration as well.

avatar image
0

Answer by kaimelar · Jan 31, 2012 at 07:52 PM

Class name and file name are not same (EventController)

EventController.cs , public class EventController : MonoBehaviour must be same

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.

Welcome to Unity Answers

If you’re new to Unity Answers, please check our User Guide to help you navigate through our website and refer to our FAQ for more information.

Before posting, make sure to check out our Knowledge Base for commonly asked Unity questions.

Check our Moderator Guidelines if you’re a new moderator and want to work together in an effort to improve Unity Answers and support our users.

Follow this Question

Answers Answers and Comments

6 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Multiple Cars not working 1 Answer

Distribute terrain in zones 3 Answers

C# on/off any Script Component (mixed C# and JS) 1 Answer

error CS0246: type/namespace name `GameDate' couldn't be found. 1 Answer

SocketIOEvent could not be found 0 Answers


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