Unity load and add animation controller dynamically - c#

My code now:
Animator ContainerAnimator = this.GetComponent<Animator>();
ContainerAnimator.runtimeAnimatorController = Resources.Load("Assets/Cube") as RuntimeAnimatorController;
ContainerAnimator.Play("ContainerMoveUp");
I've got some dynamically created objects which have animators. these animators still don't have a controller in there which I'm trying to add, and it doesn't appear to work. any tips or tricks to do this? google is running out of answers

Resources.Load("Assets/Cube") is likely returning null.
You have to put the animation controller in a folder called "Resources" in the Assets folder. You must spell that correctly. Move your animation Contoller into this "Resources" folder.
After this, remove the "Assets/" from the Resources.Load function. The path to pass to that should be a relative path in the Resources folder.
If the animation controller name is "Cube", you can then load it like this:
Resources.Load("Cube")
instead of:
Resources.Load("Assets/Cube")

You might be loading the asset from the wrong directory or misplaced the filename. Here, you just remove the Assets/ prefix from the code to resolve the issue.
You can try the following implementation as well.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayAnimationDemo : MonoBehaviour
{
[SerializeField]
Animator anim; // refer the animator via inspector
void Start() {
PlayAnimation(anim, "Cube", "ContainerMoveUp");
}
// animator is the animator object referred via inspector
// fileName is the animator controller file name which should put under the Resources folder
// animName is the animation clip name, you want to play
void PlayAnimation(Animator animator, string fileName, string animName) {
animator.runtimeAnimatorController = Resources.Load(fileName) as RuntimeAnimatorController;
animator.Play(animName);
}
}

Related

Unity script doesn't "take" in editor

I am learning Unity. Working through the rollaball tutorial, I have come as far as video 8, where I add the line "public float speed=0;" this reveals what I already suspected, namely that in some way my script does not "take" in the unity editor.
I use Visual Studio code as my normal editor. I told Unity that it is going to be my editor for scripts.
In this tutorial, I started by pressing a "new script" button as recommended by the tutorial, and created the file PlayerControl.cs in the editor. However, as the screenshot shows, the editor doesn't look like it has really taken possession of edited script, and it certainly hasn't added "speed" as a visible field. Besides which, nothing that I try will actually move the ball.
Okay, so my Unity install is brand-new, and I can easily believe that I might have missed a bit. But where to look, how to diagnose? Is there a log file I should be looking at?
The meaning of the OnMove method is not entirely clear from documentation that I can find. Is it called when the mouse moves? If so, it too is being unresponsive.
Tutorial:
https://learn.unity.com/tutorial/moving-the-player?uv=2020.2&projectId=5f158f1bedbc2a0020e51f0d#
System: Mac OS 11.6
VS Code 1.74.2
Script code is below
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerControl : MonoBehaviour {
public float speed = 0;
private RigidBody rb; // so Inspector doesn't see it
private float movementX, movementY;
// Start is called before the first frame update
void Start()
{
rb = GetComponent<RigidBody>();
}
void OnMove(InputValue mvt)
{
Vector2 movementVector = mvt.Get<Vector2>();
movementX = movementVector.x;
movementY = movementVector.y;
}
void FixedUpdate()
{
Vector3 movement = new Vector3(movementX, 0.0f, movementY);
rb.AddForce(movement * speed);
}
}
I don't know whether you have installed the visual studio code package or not. This is required to correctly integrate VS Code and Unity.
Just try saving the script again and return to Unity. Unity should now refresh and recompile the script into assembly then there will be the change reflected in editor.
And for the part where you can't understand OnMove() that explanation is as follows:
Since you are using Unity's New Input System, you would have created an action map. Unity will automatically call functions for each action in Action Map which is named [On + ActionName] OnMove() in all scripts. Since, the Behavior in PlayerInput Component is Set to Send Messages.

How to load a material file in Unity which is outside Assets folder?

I have a plane, whose material I want to load dynamically at run time. The said material is outside the Unity Project Folder. How do I load it in my game?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Experiment : MonoBehaviour
{
public Material materialToChange;
Material m_Material;
void Start()
{
m_Material = GetComponent<Renderer>().material;
}
void Update()
{
if(Input.GetKeyDown("a"))
{
GetComponent<Renderer>().material=materialToChange;
}
}
}
So here I want materialToChange be a material file whose path I want to give and is outside the Unity Project folder.
Unity provides AssetBundles which allow to load assets (GameObjects, Materials etc ... ) at runtime.
The objective is to create an AssetBundle which contains your new materials for example. Then you can download this AssetBundle (from local path or from the web) and extract your assets.
You will be able to change your material with the new one !
Take a look at this page : Unity AssetBundles

How to use Resources.Loadall for only .fbx, .obj files

In Unity, Resources.LoadAll(path) method would access T type in the specific path(e.g.Resources/Meshes/Buildings). Then we can add all these files to our array.
However, I can't specific any file like .fbx, .obj, .png, etc. The T type allows us to access only the Unity classes suck as GameObject, Texture2D, Mesh and so on...
Here is my script
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
public class AutoPre_Manager : MonoBehaviour
{
public Object[] tractorobj;
public GameObject[] directoryAllFiles;
public string[] Model_Folder;
public List<GameObject> meshGameobj;
private void Start()
{
loadModels();
}
public void loadModels()
{
meshGameobj = new List<GameObject>();
directoryAllFiles = Resources.LoadAll<GameObject>("Model/Equipment");
}
}
The script compiled, smoothly. And when I ran the game, Resources.LoadAll would get every files in my folder(.fbx, .prefabs, .cs)
If I only need .fbx files, what should I do?
Thank you in advance
Unfortunately, there is no way you can distinguish .fbx and .prefabs just by typing the path because extensions are ignored. Here is what you can do:
Try placing your .fbx files into a new folder like: "Model/Equipment/FBXs".
Set the .fbx list through inspector.
Add a tag to .fbx files then after loadall filter the array, but I wouldn't recommend this method because wastes memory.

How can I access the Unity 'Light 2D (Script)' component via Script?

In my Unity 2D game, I have a character with a lightsource component
'Light 2D(Script)' from the Lightweight RP package.
I want to change the intensity of the Light 2D with the code below.
But I can't assign the 'Light 2D(Script)' to the public Light LightSource in the Unity Inspector panel.
I've tried using public Light2D LightSource class but it doesn't seem to exist.
Is there any other way to access the 2D Light component or something I'm doing wrong?
I've also added a screenshot of the Inspector pane, if it helps.
If there's any more information you need just tell me and I hope someone can help. Thanks
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lighting : MonoBehaviour
{
public Light LightSource;
public float lightIntensity;
public float minIntensity = 0.35f, maxIntensity = 0.65f;
void Update()
{
lightIntensity = Random.Range(minIntensity, maxIntensity);
LightSource.intensity = lightIntensity;
}
}
Character Inspector Screenshot
Assuming you are using the universal render pipeline for 2D lighting this is the solution I found.
Within the Light2D script (which you can open by clicking the three vertical dots in the top right of the Light2D component and hitting edit script) there is the declaration of the namespace UnityEngine.Experimental.Rendering.Universal In order to reference Light2D simply at the top of your script write
using UnityEngine.Experimental.Rendering.Universal;
There may appear to be an error when doing this, but press on. From here on out you'll be able to reference the Light2D component much as you would any other component, such as using GetComponent<Light2D>() If any of this gives an error within your code editor still compile to test if it works, I have a fully functioning script using this method but Visual Studio still believes that Light2D does not exist. Regardless, this appears to work and I hope this works for everyone else as well.
Ok bud i got your answer.
First off, u need to open the Light2D(script) do the following:
1.) add the following to the top of the script:
using System.Collections;
using UnityEngine;
2.) you need to set the class of the Light2D script to "public" (so u can access it in your "lighting.cs" script.):
public class Light2DManager : IDisposable
3.) once that is done save the light2d script.
Ok now we are going to access it...
in your Lighting script we do the usual when we want to access another script:
GameObject TheLight = GameObject.Find("The Gameobject the script is on");
UnityEngine.Experimental.Rendering.LWRP.Light2D The2DLights = TheLight.GetComponent <UnityEngine.Experimental.Rendering.LWRP.Light2D> ();
Now you should have access, just type the following to confirm:
The2DLights. (and you will get options like intensity etc etc)
This is my first time ever answering a question. turns out i was having the same issue, happy to help.
Ran into this today, to expand on this solution of the using statement (simply adding it did not work in my case, on 2020.2) at the top you can do:
using Light2DE = UnityEngine.Experimental.Rendering.Universal.Light2D;
Then use Light2DE as the class instead of Light2D in your script.
light = transform.GetComponent<Light2DE>();
I don't understand the question very clearly, but it's possible you're just looking for "GetComponent".
Here's a random example,
public class CamToUI:MonoBehaviour
{
[System.NonSerialized] public WebCamTexture wct;
public Text nameDisplay;
private RawImage rawImage;
private RectTransform rawImageRT;
private AspectRatioFitter rawImageARF;
private Material rawImageMaterial;
void Awake()
{
rawImage = GetComponent<RawImage>();
rawImageRT = rawImage.GetComponent<RectTransform>();
rawImageARF = rawImage.GetComponent<AspectRatioFitter>();
}
GetComponent finds "thing" (such as a "light2D") which is attached to that same game object.
• You have some game object
• A script, Script.cs, is attached to that game object
• Some other thing (say, Light2D) is attached to that same game object
Inside the script Script.cs, you can find the other thing, using GetComponent.
Ideally, don't call GetComponent repeatedly, just call it once in Awake or whatever. (But you're a mile away from worrying about performance, so don't worry about it.)
using UnityEngine.Experimental.Rendering.Universal;
using UnityEngine;
public class Light2DController : MonoBehaviour {
void Awake() {
//assuming You have Light2D component in the same object that has this script
Light2D light = transform.GetComponent<Light2D>();
}
}
Unity 2019.3.0f1
Here's how you can access the Light2D(Script) components.
Unity Version: Unity 2020.1.4f1
Import using UnityEngine.Experimental.Rendering.Universal; into your Script.
Please find the below code example.
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Experimental.Rendering.Universal;//Important
public class Lighting : MonoBehaviour
{
Light2D theLights; // To Access the Light Components.
public float maxRange = 0.54f;
public float minRange = 0.31f;
public float flickerSpeed = 0.5f;
void Update()
{
//Assuming You have Light2D component in the same object that has this script.
theLights.intensity = Mathf.Lerp(minRange, maxRange, Mathf.PingPong(Time.time, flickerSpeed));
// The above Line is to create a flickering effect, You can also set a value like for example: theLights.intensity=0.5f, To set the intensity of the Light.
}
}
You can also access other Light2D components similar way
theLights.color = new Color(0, 255, 0);// here I am accessing color and setting a new color value.
In newer versions of unity (i'm using 2021.2.7f1) use this:
using UnityEngine.Rendering.Universal;
And then in code:
Light2D light = gameObject.GetComponent<Light2D>();

Unity "The associated script can not be loaded" and "Win32Exception: The system cannot find the file specified"

so I'm new to Unity and I've been trying to test the scene with the script attatched to a character. However, it keeps saying "The associated script cannot be loaded. Please fix any compile errors and assign a valid script." It also says that the name of the file could be different from the name in the code but it isnt, and also it says that the code could be missing MonoBehaviour Scripts. It wont even allow me to attach the script to characters because it cant find the script class.
I've copied and downloaded character movement codes from the internet but they didnt work either. I've also tried deleting and re-making the CS files but that didnt work either. Even adding empty scripts to characters didnt work unless i do it from "Add component"
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Movement : MonoBehaviour
{
SpriteRenderer sprite;
Rigidbody2D rigid;
// Start is called before the first frame update
void Start()
{
sprite = GetComponent<SpriteRenderer>();
rigid = GetComponent<Rigidbody2D>();
}
private void FixedUpdate()
{
if (Input.GetKey("d"))
rigid.velocity = new Vector2(2, 0);
else if (Input.GetKey("a"))
rigid.velocity = new Vector2(-2, 0);
}
}
There are also these errors in Unity if that helps
I think your class name is different from file name.
Unity apparently can't handle apostrophes (single-quote ') in the directory name of the editor. You need to get rid of the apostrophe in your directory name. Once you make that change, Unity should be able to build the scripts as intended.
Edit: This has been fixed in more recent versions - see https://issuetracker.unity3d.com/issues/scripts-do-not-get-compiled-if-the-unity-editor-path-contains-apostrophes for reference
First, it is recommended to use "Add component" to create a script, if you want to attach it to a GameObject, as it automatically imports necessary libraries. Implementing MonoBehaviour is necessary for adding a script to a GameObject.
Second, FixedUpdate() should not be set to private, it does not need an access modifier, just like Start(), see https://docs.unity3d.com/ScriptReference/MonoBehaviour.FixedUpdate.html.
Third, the errors in your first screenshot seem to imply that there is a problem with your Unity installation. Try reinstalling it and make sure that the Editor you install matches your operating system (64 or 32 bit?).
Fourth, the second screenshot is shown when you use any obsolete libraries or classes, which does not seem to be the case in the script you shared.
Hope that helps.
It's basically because you deleted some script or renamed it or degraded unity version. you might have to reassign the script at the required position/component.
Note: Make sure that class name is the same as the script name in unity.

Categories

Resources