Tutorial request for attaching scripts automatically on unit

   6246   8   2
User Avatar
Member
40 posts
Joined: Dec. 2014
Offline
Hello!

in one of your samples (the door demo) you attach a script automatically on unity, i would like to request a tutorial in how this was achieved so we can learn how to do that in our models.

thank you!
User Avatar
Member
402 posts
Joined: March 2013
Offline
A tutorial would be nice and I'll push that on the agenda but in the mean time here's a quick howto.

It's actually not too bad. You just need a detail string attribute on visible SOP of the object you want to attach the script to.

The attribute has to be called: “Unity_Script”

It has to contain a JSON string that starts with the variable “script” with the value being the name of the Unity script (no .cs). Afterwards, you just name the variables you want to set on that script (on-attach) and their values in the form: “arg#Name”:“<variable_name>”, “arg#Type”:“<type>”, “arg#Value”:“<value>”. The “#” should start with 0 and just increase by 1 for each argument.

Here's the example for the doors asset. Notice the name of the Unity script is “doorAnim” and it's setting the “string” variable “door0” to “door_0”.

{“script”:“doorAnim”, “arg0Name”:“door0”,“arg0Type”:“string”, “arg0Value”:“door_0”, “arg1Name”:“door1”, “arg1Type”:“string”, “arg1Value”:“door_1”, “arg2Name”:“door_width”, “arg2Type”:“float”, “arg2Value”:“1.14999985695”, “arg3Name”:“speed”, “arg3Type”:“float”, “arg3Value”:“1.0”}

Look inside the door demo asset, specifically at the “Control” object to see how this string is assembled.
User Avatar
Member
40 posts
Joined: Dec. 2014
Offline
thank you damian!! i did not mean like a full tutorial, this is enough, i will try it ASAP
User Avatar
Member
40 posts
Joined: Dec. 2014
Offline
Thank you Damian! this worked perfectly fine!!
User Avatar
Member
402 posts
Joined: March 2013
Offline
Nice! I'm glad it worked for you! Let me know if you see any potential improvements.
User Avatar
Member
40 posts
Joined: Dec. 2014
Offline
Thank you damian!

there is something but i fixed it with a workaround, not sure if it is worth reporting but here it is:

i want to add reaction scripts to colliders created inside houdini, however the script is added to the output game object (sorry for typo in unity), i fixed it at runtime, the script searches for the collider inside the hierarchy and instantiates itself in that game object.

not exactly a bug, but an opinion only. thanks again damian!

Attachments:
scripttt.jpg (142.3 KB)

User Avatar
Member
402 posts
Joined: March 2013
Offline
For now, your fix seems as good as anything we could come up with.

It's not clear how one might specify in Houdini which “part” of the geo you want the script attached to because those “parts” don't really exist in Houdini. They get created in Houdini Engine and the names are not really reliable.

But it's a good feature request. I'll keep in in mind.
User Avatar
Member
897 posts
Joined: July 2018
Offline
i fixed it at runtime, the script searches for the collider inside the hierarchy and instantiates itself in that game object.
LSparkle: I'd like to do exactly this. Do you mind (or anyone else) showing how this is done in a script? As someone who's used to do these setups inside Houdini, this runtime level of scripting is quite new to me.

Edit: Never mind. Think I'm getting it.


using UnityEngine;
using System.Collections;
public class inheritBehaviour : MonoBehaviour {
    // Adds a sphere collider to all children that doesn't have a collider
    void Start() {
        print("init" + this.gameObject.name);
        //print("Components: " + this.gameObject.GetComponents(typeof(GameObject)));
        int nChildren = this.gameObject.transform.childCount;
        for (int i = 0; i < nChildren; i++)
        {
            GameObject child = this.gameObject.transform.GetChild(i).gameObject;
            if (child.GetComponent<Collider>())
            { // If this game object has a collider, continue
                print("Collider found on object" + gameObject.name);
            }
            else
            {
                print("No collider found on object" + gameObject.name);
                SphereCollider sc = child.AddComponent<SphereCollider>(); //add collider
            }
        }
    }
}
Edited by kahuna031 - Feb. 26, 2017 15:01:48
B.Henriksson, DICE
User Avatar
Member
40 posts
Joined: Dec. 2014
Offline
yep! this is exactly what i did!
  • Quick Links