Question by
$$anonymous$$ · Jun 30, 2017 at 08:42 PM ·
c#unity 5characterunityeditorselection
Plane character selector unity problem
I'm stuck in the past two days in how to do a character selection with a buying button by the guldens , the toggling works fine but there's something wrong with the character here's screenshot's .
I want when i toggle right or left to be in the same position and i tried to much to fix this and till now there's no result
[1]: https://i.stack.imgur.com/cB2Rl.jpg
When i toggle left or right its look like this
[2]: https://i.stack.imgur.com/FPRYJ.jpg
Here's my code
That's the MenuScene scrpit
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class MenuScene : MonoBehaviour {
private CanvasGroup fadeGroup;
private float fadeInSpeed = 0.33f;
public RectTransform menuContainer;
public Transform levelPanel;
public Transform colorPanel;
public Transform trailPanel;
public Button tiltControlButton; // Change the name of the button
public Color tiltControlEnabled;
public Color tiltControlDisabled;
public Text buyColorText;
public Text buyTrailText;
public Text goldText;
private MenuCamera menuCam;
private int[] colorCost = new int[] { 0, 5, 5, 5, 10, 10, 10, 15, 15, 10, 0, 5, 5, 5, 10, 10};
private int[] trailCost = new int[] { 0, 20, 30, 40, 50, 60, 70, 80, 90, 100, 5, 5, 5, 10, 10 };
private int selectedColorIndex;
private int selectedTrailIndex;
private int activeColorIndex;
private int activeTrailIndex;
private Vector3 desiredMenuPosition;
private GameObject currentTrail;
public AnimationCurve enteringLevelZoomCurve;
private bool isEnteringLevel = false;
private float zoomDuration = 3.0f;
private float zoomTransition;
private void Start()
{
// Check if we have an accelerometer
if(SystemInfo.supportsAccelerometer)
{
// It is currently enabled ?
tiltControlButton.GetComponent<Image>().color = (SaveManager.Instance.state.usingAccelerometer) ? tiltControlEnabled : tiltControlDisabled;
}
else
{
tiltControlButton.gameObject.SetActive(false);
}
//Find the only MenuCamera and assign it
menuCam = FindObjectOfType<MenuCamera>();
// Position our camera on the focused menu
SetCameraTo(Manager.Instance.menuFocus);
// Tell our gold text how much he should displaying
UpdateGoldText();
//Grab the only canvasGroup in the scene
fadeGroup = FindObjectOfType<CanvasGroup>();
//Start with a white screen
fadeGroup.alpha = 1;
// Add button on-click events to shop buttons
InItShop();
//Add button on-Click events to levels
InitLevel();
// Set players prefrences ( color & trail )
OnColorSelect(SaveManager.Instance.state.activeColor);
SetColor(SaveManager.Instance.state.activeColor);
OnTrailSelect(SaveManager.Instance.state.activeTrail);
SetTrail(SaveManager.Instance.state.activeTrail);
// Make the buttons bigger for the selected items
colorPanel.GetChild(SaveManager.Instance.state.activeColor).GetComponent<RectTransform>().localScale = Vector3.one * 1.125f;
trailPanel.GetChild(SaveManager.Instance.state.activeTrail).GetComponent<RectTransform>().localScale = Vector3.one * 1.125f;
// Create the trail preview
/*lastpreviewObject = GameObject.Instantiate(Manager.Instance.playertrails[SaveManager.Instance.state.activeTrail]) as GameObject;
lastpreviewObject.transform.SetParent(trailPreviewObject);
lastpreviewObject.transform.localPosition = Vector3.zero;*/
}
private void Update()
{
// Fade-in
fadeGroup.alpha = 1 - Time.timeSinceLevelLoad * fadeInSpeed;
//Menu navigation
menuContainer.anchoredPosition3D = Vector3.Lerp(menuContainer.anchoredPosition3D, desiredMenuPosition, 0.1f);
// Entering level zoom
if(isEnteringLevel)
{
// Add to the zoomTransition float
zoomTransition += (1 / zoomDuration) * Time.deltaTime;
// Change the scale, following the animation curve
menuContainer.localScale = Vector3.Lerp(Vector3.one, Vector3.one * 5, enteringLevelZoomCurve.Evaluate(zoomTransition));
// Change the desired position of the canvas , so it can follow the scale up
// This zooms in the center
Vector3 newDesiredPosition = desiredMenuPosition * 5;
// This adds to the specific position of the level on the canvas
RectTransform rt = levelPanel.GetChild(Manager.Instance.currentLevel).GetComponent<RectTransform>();
newDesiredPosition -= rt.anchoredPosition3D * 5;
// This line will override the previous position
menuContainer.anchoredPosition3D = Vector3.Lerp(desiredMenuPosition, newDesiredPosition, enteringLevelZoomCurve.Evaluate(zoomTransition));
// Fade to white screen , this will override the first line in the update
fadeGroup.alpha = zoomTransition;
// Are we done with the animation
if(zoomTransition >= 1)
{
// Enter the level
SceneManager.LoadScene("Game");
}
}
}
private void InItShop()
{
// Just make sure we've assigned the referencess
if (colorPanel == null || trailPanel == null)
Debug.Log("You didnt not asign the color/trail panel in the inspector");
//For every children transfrom under our color panel , find the button and add onClick
int i = 0;
foreach (Transform t in colorPanel)
{
int currentIndex = i;
Button b = t.GetComponent<Button>();
b.onClick.AddListener(() => OnColorSelect(currentIndex));
// Set color of the image, based on if owned or not
Image img = t.GetComponent<Image>();
img.color = SaveManager.Instance.IsTrailOwned(i)
? Manager.Instance.playerColors[currentIndex]
: Color.Lerp(Manager.Instance.playerColors[currentIndex], new Color(0, 0, 0, 1), 0.25f);
i++;
}
//Reset index
i = 0;
//Do the same for the trail
foreach (Transform t in trailPanel)
{
int currentIndex = i;
Button b = t.GetComponent<Button>();
b.onClick.AddListener(() => OnTrailSelect(currentIndex));
// Set trail of the image, based on if owned or not
RawImage img = t.GetComponent<RawImage>();
img.color = SaveManager.Instance.IsColorOwned(i) ? Color.white : new Color (0.7f, 0.7f, 0.7f);
i++;
}
// Set the previous trail , to prevent bug when spawing later
// previousTrail = trailPanel.GetChild(SaveManager.Instance.state.activeTrail).GetComponent<RawImage>().texture;
}
private void InitLevel()
{
// Just make sure we've assigned the referencess
if (levelPanel == null )
Debug.Log("You didnt not asign the level panel in the inspector");
//For every children transfrom under our level panel , find the button and add onClick
int i = 0;
foreach (Transform t in levelPanel)
{
int currentIndex = i;
Button b = t.GetComponent<Button>();
b.onClick.AddListener(() => OnLevelSelect(currentIndex));
Image img = t.GetComponent<Image>();
// Is it unlocked ?
if (i <= SaveManager.Instance.state.completedLevel)
{
//It is unlocked!
if(i == SaveManager.Instance.state.completedLevel)
{
//It's not completed !
img.color = Color.white;
}
else
{
// level is already completed !
img.color = Color.green;
}
}
else
{
// Level isn't unlock , disable the button
b.interactable = false;
// Set to a dark color
img.color = Color.grey;
}
i++;
}
}
private void SetCameraTo(int menuIndex)
{
NavigateTo(menuIndex);
menuContainer.anchoredPosition3D = desiredMenuPosition;
}
private void NavigateTo(int menuIndex)
{
switch(menuIndex)
{
// 0 && default case = main menu
default:
case 0:
desiredMenuPosition = Vector3.zero;
menuCam.BackToMainMenu();
break;
// 1 = play menu
case 1:
desiredMenuPosition = Vector3.right * 1280;
menuCam.MoveToLevel();
break;
// 2= shop menu
case 2:
desiredMenuPosition = Vector3.left * 1280;
menuCam.MoveToShop();
break;
}
}
private void SetColor(int index)
{
// Set the active index
activeColorIndex = index;
SaveManager.Instance.state.activeColor = index;
//Change the color of the player
Manager.Instance.playerMaterial.color = Manager.Instance.playerColors[index];
//change buy/set button text
buyColorText.text = "Current";
// Remember prefrences
SaveManager.Instance.Save();
}
private void SetTrail(int index)
{
// Set the active index
activeTrailIndex = index;
SaveManager.Instance.state.activeTrail = index;
//Change the trail of the player
if (currentTrail != null)
Destroy(currentTrail);
// Create the new trail
currentTrail = Instantiate(Manager.Instance.playertrails[index]) as GameObject;
// Set it as a children of the player
currentTrail.transform.SetParent(FindObjectOfType<MenuPlayer>().transform);
// Fix the wierd scalling issues / rotation issues
currentTrail.transform.localPosition = Vector3.zero;
currentTrail.transform.localRotation = Quaternion.Euler(0, 0, 90);
currentTrail.transform.localScale = Vector3.one * 0.01f;
//change buy/set button text
buyTrailText.text = "Current";
// Remember prefrences
SaveManager.Instance.Save();
}
private void UpdateGoldText()
{
goldText.text = SaveManager.Instance.state.gold.ToString();
}
//Buttons
public void OnPlayClick()
{
NavigateTo(1);
Debug.Log("Play Button Has Been Clicked");
}
public void OnShopClick()
{
NavigateTo(2);
Debug.Log("Your in the shop");
}
public void OnBackClick()
{
NavigateTo(0);
Debug.Log("Back button has been clicked");
}
private void OnTrailSelect(int currentIndex)
{
Debug.Log("Selecting trail button : " + currentIndex);
// If the button clicked is already selected, exist
if (selectedTrailIndex == currentIndex)
return;
// Preview trail
// Get the image of the preview button
//trailPanel.GetChild(selectedTrailIndex).GetComponent<RawImage>().texture = previousTrail;
// Keep the new trails preview image in the previous trail
//previousTrail = trailPanel.GetChild(currentIndex).GetComponent<RawImage>().texture;
// Set the new trail preview image to the other camera
//trailPanel.GetChild(currentIndex).GetComponent<RawImage>().texture = trailPreviewTexture;
// Change the physical object of the trail preview
/* if (lastpreviewObject != null)
Destroy(lastpreviewObject);
lastpreviewObject = GameObject.Instantiate(Manager.Instance.playertrails[currentIndex]) as GameObject;
lastpreviewObject.transform.SetParent(trailPreviewObject);
lastpreviewObject.transform.localPosition = Vector3.zero;*/
// Make the icon slightly bigger
trailPanel.GetChild(currentIndex).GetComponent<RectTransform>().localScale = Vector3.one * 1.125f;
// Put the previuos one on normal scale
trailPanel.GetChild(selectedTrailIndex).GetComponent<RectTransform>().localScale = Vector3.one;
// Set the selected color
selectedTrailIndex = currentIndex;
//Change the content of the buy/set button button , depending on the state of the color
if (SaveManager.Instance.IsTrailOwned(currentIndex))
{
// Trail is owned
// Is it already our current color ?
if (activeTrailIndex == currentIndex)
{
buyTrailText.text = "Current";
}
else
{
buyTrailText.text = "Select";
}
}
else
{
// Trail isnt owned
buyTrailText.text = "Buy:" + trailCost[currentIndex].ToString();
}
}
private void OnColorSelect(int currentIndex)
{
Debug.Log("Selecting Color button : " + currentIndex);
// If the button clicked is already selected, exist
if (selectedColorIndex == currentIndex)
return;
// Make the icon slightly bigger
colorPanel.GetChild(currentIndex).GetComponent<RectTransform>().localScale = Vector3.one * 1.125f;
// Put the previuos one on normal scale
colorPanel.GetChild(selectedColorIndex).GetComponent<RectTransform>().localScale = Vector3.one;
// Set the selected color
selectedColorIndex = currentIndex;
//Change the content of the buy/set button button , depending on the state of the color
if(SaveManager.Instance.IsColorOwned(currentIndex))
{
// color is owned
// Is it already our current color ?
if(activeColorIndex == currentIndex)
{
buyColorText.text = "Current";
}
else
{
buyColorText.text = "Select";
}
}
else
{
// Color isnt owned
buyColorText.text = "Buy: " + colorCost[currentIndex].ToString();
}
}
private void OnLevelSelect(int currentIndex)
{
Manager.Instance.currentLevel = currentIndex;
isEnteringLevel = true;
Debug.Log("Selecting level : " + currentIndex);
}
public void OnColorBuy()
{
Debug.Log("Buy color");
// Is the selected color owned
if(SaveManager.Instance.IsColorOwned(selectedColorIndex))
{
// Set the color !
SetColor(selectedColorIndex);
}
else
{
// Attempt to buy the color
if (SaveManager.Instance.BuyColor(selectedColorIndex, colorCost[selectedColorIndex]))
{
// Success!
SetColor(selectedColorIndex);
// Change the color of the button
colorPanel.GetChild(selectedColorIndex).GetComponent<Image>().color = Manager.Instance.playerColors[selectedColorIndex];
//Update gold text
UpdateGoldText();
}
else
{
// Dont have enough gold
// Play sound feedback
Debug.Log("Not enough gold");
}
}
}
public void OnTrailBuy()
{
Debug.Log("Buy Trail");
// Is the selected trail owned
if (SaveManager.Instance.IsTrailOwned(selectedTrailIndex))
{
// Set the trail !
SetTrail(selectedTrailIndex);
}
else
{
// Attempt to buy the trail
if (SaveManager.Instance.BuyTrail(selectedTrailIndex, trailCost[selectedTrailIndex]))
{
// Success!
SetTrail(selectedTrailIndex);
// Change the color of the button
trailPanel.GetChild(selectedTrailIndex).GetComponent<Image>().color = Color.white;
//Update gold text
UpdateGoldText();
}
else
{
// Dont have enough gold
// Play sound feedback
Debug.Log("Not enough gold");
}
}
}
public void OnTiltControl()
{
// Toggle the accelerometer bool
SaveManager.Instance.state.usingAccelerometer = !SaveManager.Instance.state.usingAccelerometer;
// Make sure we save the player's preferences
SaveManager.Instance.Save();
// Change the display image of the tilt control button
tiltControlButton.GetComponent<Image>().color = (SaveManager.Instance.state.usingAccelerometer) ? tiltControlEnabled : tiltControlDisabled;
}
}
Plane Selection scrpit
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class PlaneSelection : MonoBehaviour {
private GameObject[] characterList;
private int index;
private void Start()
{
index = PlayerPrefs.GetInt("CharacterSelected");
characterList = new GameObject[transform.childCount];
// Fill the array with our models
for (int i = 0; i < transform.childCount; i++)
characterList[i] = transform.GetChild(i).gameObject;
// We toggle off their render
foreach (GameObject go in characterList)
go.SetActive(false);
// We toggle on the selected character
if (characterList[index])
characterList[index].SetActive(true);
}
public void ToggleLeft()
{
// Toggle off the current model
characterList[index].SetActive(false);
index--;//index -= 1 , index - 1;
if (index < 0)
index = characterList.Length - 1;
// Toggle on the new model
characterList[index].SetActive(true);
}
public void ToggleRight()
{
// Toggle off the current model
characterList[index].SetActive(false);
index++;//index -= 1 , index - 1;
if (index == characterList.Length)
index = 0;
// Toggle on the new model
characterList[index].SetActive(true);
}
public void ConfirmButton()
{
PlayerPrefs.SetInt("CharacterSelected", index);
SceneManager.LoadScene("Game");
}
}
Menu Camera script
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MenuCamera : MonoBehaviour {
private Vector3 startPosition;
private Quaternion startRotation;
private Vector3 desiredPosition;
private Quaternion desiredRotation;
public Transform shopWaypoint;
public Transform levelWaypoint;
private void Start()
{
startPosition = desiredPosition = transform.localPosition;
startRotation = desiredRotation = transform.localRotation;
}
private void Update()
{
float x = Manager.Instance.GetPlayerInput().x;
transform.localPosition = Vector3.Lerp(transform.localPosition, desiredPosition + new Vector3(0, x, 0) * 0.01f, 0.1f);
transform.localRotation = Quaternion.Lerp(transform.localRotation, desiredRotation, 0.1f);
}
public void BackToMainMenu()
{
desiredPosition = startPosition;
desiredRotation = startRotation;
}
public void MoveToShop()
{
desiredPosition = shopWaypoint.localPosition;
desiredRotation = shopWaypoint.localRotation;
}
public void MoveToLevel()
{
desiredPosition = levelWaypoint.localPosition;
desiredRotation = levelWaypoint.localRotation;
}
}
Comment