In our app, the splash screen appears when we start the app (or build to Android device) as the app is loading, which is done through the Unity's Edit -> Project Settings -> Player but we now have a feature that sometimes in the middle of the app also re-starts the app, so we would like to code this behavior, so that we can show a different splash screen if the app re-starts mid-usage.
We cannot seem to be able to figure out how to do this programmatically, or where exactly in the app code, so we would appreictae any help.
What we do know (and have already implemented) is through:
PlayerPrefs.SetString("LastShownComponent", menuId);
PlayerPrefs.Save();
which remembers if this is the first time the app is starting (original splash image) or whether the user is mid-usage, but how do we specify another image to be loaded as splash screen when the app is reloading mid-usage?
EDIT: more details...
Previously, we only had the following code:
if (_callbackUri == null)
{
SceneManager.LoadScene("ReloadScene");
}
Now, we force the app to re-start mid-usage (for a specific reason) by:
if (_callbackUri == null)
{
PlayerPrefs.SetInt("Restarting", 1);
PlayerPrefs.Save();
#if UNITY_ANDROID && !UNITY_EDITOR
AndroidPlugin.Restart();
#else
SceneManager.LoadScene("ReloadScene");
#endif
}
However, when it restarts, obviously it re-loads the same splash screen image that is in the player settings.
We probably need to add code just below AndroidPlugin.Restart(); to load a new splash screen image, but how do we do that? Do we need a new scene for that?
Per the comments:
Quickest way to test this is to create a blank scene, add a gameobject to that scene name it something like SplashLoader and give it a script.
the only thing you need in that script is the start method,
void Start()
{
// Default to 0 incase this value isn't stored
int reloaded = PlayerPrefs.GetInt("Restarting", 0);
// Reset to 0 so if the game is closed without restarting it will display the correct scene
PlayerPrefs.SetInt("Restarting", 0);
PlayerPrefs.Save();
if(reloaded == 1)
{
SceneManager.LoadScene("ReloadScene");
}
else
{
SceneManager.LoadScene("SplashScene");
}
}
From here you would create 2 scenes, one for your normal SplashScene and 1 for your ReloadScene. In those scene you can create a canvas object and add an image to it then change the image depending which scene it is.
Another Option if you want to use a single scene and keep the same animation say you have an effect where your logo fades in, you can do this:
Create a scene for your splash screen, make that your 0 index scene, add a canvas to it and an image, then use an animator to get your splash screen effect going.
Add a script to your image object, to change the picture depending on what the preference stores, you can use almost the same code as the start method above, instead of calling the SceneManager to load the scene you would just update the image.
Short answer: you can't.
The splash screen (and everything associated with it) can only be changed/modified inside the editor (via Inspector or via code using the UnityEditor.PlayerSettings.SplashScreen class).
To add insult to injury, on Android you MUST have a splash screen: if you try to disable it via the Player Settings, the Android app won't work.
So, the only solution you have is to use a blank splash screen, and then two different starting scenes (with different backgrounds) which are loaded, mutually exclusively, if you are launching or restarting the app (by using a field in PlayerPrefs as you correctly thought).
EDIT
Actually, you don't even need multiple scenes to accomplish what you want to do.
Create just one scene (let's call it SplashScene), with just the Main Camera and a Canvas with an Image.
Attach this script to the Main Camera:
using UnityEngine;
using UnityEngine.UI;
using System;
public class NewBehaviourScript : MonoBehaviour {
[SerializeField]
Image backgroundImage;
[SerializeField]
Sprite launchBackground, restartBackground;
private void Awake() {
if (!PlayerPrefs.HasKey("Background Splash Screen"))
PlayerPrefs.SetInt("Background Splash Screen", 0);
int background = PlayerPrefs.GetInt("Background Splash Screen");
switch (background) {
case 0:
backgroundImage.sprite = launchBackground;
break;
case 1:
backgroundImage.sprite = restartBackground;
break;
default:
throw new Exception("Invalid Background Splash Screen PlayerPref value!");
break;
}
}
}
Of course SplashScene should be at index 0 in the standalone scenes list.
The only other thing you need to do is to add
PlayerPrefs.SetInt("Background Splash Screen", 0);
before any Application.Quit(); method you call in your project and
PlayerPrefs.SetInt("Background Splash Screen", 1);
before any AndroidPlugin.Restart(); method in your code.
Don't forget to assign the sprites and the image reference to the variables of the script via Inspector ofc (you can get them via GetComponent and asset loading if you prefer, it's up to you).
That's pretty much it. :)
Related
When I start my game (regardless of a platform) I notice that all the scenes load in background directly after showing the splash screen. I know they're being loaded because once I try to load them from the menu they show up immediately. And it takes a lot of time to load right after startup.
However I only want to load the menu scene (title) first. And only after an option is selected I want to load the other ones.
In menu code I load scenes like this once a button is clicked.
StartCoroutine (LoadALevel ());
The coroutine method:
private IEnumerator LoadALevel()
{
async = SceneManager.LoadSceneAsync("space");
yield return async;
}
Any help is appreciated!
i am learning unity and i want to know... if it is possible to add small animated intro video or .gif animations to splash screen in unity? if yes, then how to do it? i have tried to change splash screen using player setting but .gif animation is not working.
The answer is actually yes or no depending on how you want to do this.
Is it possible to add animated/intro video to splash screen in Unity from
the Player Settings?
No. You can only add images to Unity's splash screen system from this menu.
Is it possible to add animated/intro video to Unity?
Yes. Make an intro scene and make it to be the first scene to load from the Build Settings. Use Unity's VideoPlayer API to load and play the intro video when this into scene loads. When the intro video is done playing, load your main scene.
I got it, Just wanted to share my code it might be helpful for someone.
public class PlayIntro : MonoBehaviour {
private string movie = "Logo_Intro.mov";
void Start ()
{
StartCoroutine(streamVideo(movie));
}
private IEnumerator streamVideo(string video)
{
Handheld.PlayFullScreenMovie(video, Color.black, FullScreenMovieControlMode.Hidden, FullScreenMovieScalingMode.Fill);
yield return new WaitForEndOfFrame ();
SceneManager.LoadScene ("Game");
}
}
I am getting the issue: The app does not use the Daydream controller properly
The app allows users to use head gaze to position the cursor and interact with menu UI's "Play" button.
Here is my class that sets the GvrPointerInputModule.Pointer to either use the GVRLaserPointer (for daydream) or the GvrReticlePointer (for cardboard):
public class InputModuleSelector : MonoBehaviour {
bool DaydreamControllerConntected = false;
public GvrBasePointer DayDreamController;
public GvrBasePointer CardboardController;
private void Start() {
refreshControllers();
}
public static bool IsDayDreamMode() {
return VRSettings.loadedDeviceName != "cardboard";
}
private void refreshControllers() {
DaydreamControllerConntected = IsDayDreamMode();
DayDreamController.gameObject.SetActive(DaydreamControllerConntected);
CardboardController.gameObject.SetActive(!DaydreamControllerConntected);
GvrPointerInputModule.Pointer = DaydreamControllerConntected ? DayDreamController : CardboardController;
}
}
If we use the daydream, we will use the laser, otherwise we will use the reticle.
How can I get my app to pass? Are we allowed to submit an app that can be used for both daydream and cardboard? Let me know if you need more information.
I am not sure if I should include a link... but my app is active on the playstore: https://play.google.com/store/apps/details?id=com.fungamefuntime.warehouse
It appears as though you let the cursor be controlled with head gaze. Head gaze is allowed as a controller substitute in all elements of gameplay, except when menus appear.
I was able to figure and correct the issue with the help from Google Support. The main Camera rotates with the player's gaze direction. This means that the GvrControllerPointer depends on the main camera. This violated the requirements because you moved the laser when you also moved your head. Hierarchy View:
Player
Main Camera
GvrReticlePointer
GvrControllerPointer
When I switched to this structure, the problem was solved. The GvrControllerPointer is now independent of the Main Camera and the player's gaze.
Player
GvrControllerPointer
Main Camera
GvrReticlePointer
Currently I'm using Application.load() to change scenes and it works perfectly in Unity. When I built it to a mobile platform and tested it, only in that one scene I can't change to a specific scene.
For example, gameplayScene, levelSelectionScene, mainMenu. I'm able to change scene from mainMenu to levelSelectionScene and then to gameplayScene. For unknown reason, I'm unable to go back to levelSelectionScene from gameplayScene while I can change scene to mainMenu from gameplayScene.
Below is the sample code from button that goes to levelSelectionScene from gameplayScene
private void OnClick ()
{
Debug.Log ("clicked");
if (PlayerPrefs.GetInt("SanguineDifficultyAchieved") == 1)
{
Debug.Log("Entering Difficulty");
m_Owner.SetActive ();
}
else
{
Debug.Log("Exiting");
State.Current = State.NotInGame;
Application.LoadLevel(scene.name);
}
m_Owner.close ();
I don't understand why it works on Unity debugger but then it doesn't work on mobile platforms.
Update 1
I tried to use numbers instead of strings it worked well. But I still don't understand the reason why.
Finally got an answer. It seems that the scenes collided with each other because I use scenes from Asset Bundle and the added scenes from build settings. That is why the when i use Application.Load(int number) works because i only access the scene from build settings.
I am using the barcodereader sample application provided in the cascades samples to embed a QRCode scanner into my application.
As it stands the sample is great, but I want the scanner to open as soon as the user navigates to my screen and I want to get rid of the opening slider images that are in the sample.
Firstly, I have tried removing the images and their animations and adding the action:
onCreationCompleted: {
camera.open()
}
to the Page. This opens the camera perfectly as expected, but for some reason, the bacrode just doesn't scan.
So, I wound back a step, and this time I just put the code in exactly as is and just changed the code to read:
onCreationCompleted: {
startupAnimation.play()
}
As expected, the screen open, plays the annimation, but still it fails to read barcodes, however, if I invoke the animation again (by tapping the screen), the animation plays again and the scanner reads the barcode without any issues at all.
All I can think of is that this is a timing issue and that I need some sort of delay after the screen has been created before the camera can be started as a barcode reader?
Anyone able to help?
Thanks,
Douglas
To get scanning right away at application launch, you need to make sure the camera is actually set up and initialized.
Basically, in onCreationComplete, open the camera. In onCameraOpened, start the viewfinder. In onViewfinderStarted, set the barcode detector camera to be the camera.