public static bool AddEntityInWorld(string entityTypeName, Vector3 position)
    {
        // TODO Get the actual entity type configuration
        Mesh configuredMesh      = GameObject.Instantiate(rabbitPrefab.transform.Find("Model").gameObject.GetComponent <MeshFilter>().sharedMesh);
        Type configuredBehaviour = typeof(ScriptedBehaviour);

        rabbitPrefab.SetActive(false);
        GameObject newEntity = GameObject.Instantiate(rabbitPrefab);

        rabbitPrefab.SetActive(true);

        newEntity.name = entityTypeName;
        newEntity.transform.position = position;

        GameObject model      = newEntity.transform.Find("Model").gameObject;
        MeshFilter meshFilter = model.GetComponent <MeshFilter>();

        meshFilter.sharedMesh = configuredMesh;

        MeshRenderer renderer = model.GetComponent <MeshRenderer>();

        string scriptPath = "rabbitAI.lua";

        if (entityTypeName == "rabbit")
        {
            renderer.material.SetColor("_BaseColor", Color.white);
        }
        else if (entityTypeName == "fox")
        {
            scriptPath = "foxAI.lua";
            renderer.material.SetColor("_BaseColor", Color.red);
        }

        ScriptedBehaviour scriptedBehaviour =
            newEntity.GetComponent <ScriptedBehaviour>();

        if (configuredBehaviour == typeof(ScriptedBehaviour))
        {
            scriptedBehaviour.scriptPath = scriptPath;
        }
        else
        {
            scriptedBehaviour.enabled = false;
            newEntity.AddComponent(configuredBehaviour);
        }

        newEntity.SetActive(true);

        return(true);
    }
    public static GameObject AddEntityInWorld(CreatureParameters parameters,
                                              Vector3 position)
    {
        // TODO Get the actual entity type configuration
        string entityTypeName      = parameters.creatureName.text;
        var    scriptDropDownValue = parameters.ScriptDropDown.value;
        string scriptPath          =
            parameters.ScriptDropDown.options[scriptDropDownValue].text;
        var    colorDropdownValue = parameters.ColorDropdown.value;
        string colorText          =
            parameters.ColorDropdown.options[colorDropdownValue].text;
        Mesh configuredMesh      = MeshFromInt((int)parameters.MeshNum.value);
        Type configuredBehaviour = typeof(ScriptedBehaviour);

        rabbitPrefab.SetActive(false);
        GameObject newEntity = GameObject.Instantiate(rabbitPrefab);

        rabbitPrefab.SetActive(true);

        newEntity.name = entityTypeName;
        newEntity.transform.position = position;

        GameObject model      = newEntity.transform.Find("Model").gameObject;
        MeshFilter meshFilter = model.GetComponent <MeshFilter>();

        meshFilter.sharedMesh = configuredMesh;

        MeshRenderer renderer = model.GetComponent <MeshRenderer>();

        renderer.material.SetColor("_BaseColor", ColorFromText(colorText));

        ScriptedBehaviour scriptedBehaviour =
            newEntity.GetComponent <ScriptedBehaviour>();

        if (configuredBehaviour == typeof(ScriptedBehaviour))
        {
            scriptedBehaviour.scriptPath = scriptPath;
        }
        else
        {
            scriptedBehaviour.enabled = false;
            newEntity.AddComponent(configuredBehaviour);
        }

        newEntity.SetActive(true);

        return(newEntity);
    }
    FirstWithScriptedBehaviourInSenseRange(GameObject gameObject,
                                           string behaviour)
    {
        var colliders =
            Physics.OverlapSphere(gameObject.transform.position, 10, 1);

        foreach (var collider in colliders)
        {
            var collided = collider.gameObject;
            ScriptedBehaviour scriptedBehaviour =
                collided.GetComponent <ScriptedBehaviour>();
            if (scriptedBehaviour == null)
            {
                continue;
            }
            if (scriptedBehaviour.scriptPath.StartsWith(behaviour))
            {
                //print(colliders[i].gameObject.transform.name);
                return(collided);
            }
        }

        return(null);
    }