Why My player character can't change after go to main menu - unity3d

I have game the name is quiz game RPG, and I have 1 problem with it, the problem is why after pressing to the town(which is the main menu) and change the character, play it again the character is not the current character but previous character, which is the index back to 0.
I have tried to add playerprefs on the start and change index but nothing changed. still back to 0 after that.
Character select script:
private void Start()
{
characterSelect = FindObjectOfType<_CharacterSelect>();
audioManager = FindObjectOfType<AudioManager>();
selectedCharIndex = PlayerPrefs.GetInt("Player",0);
UpdateCharacterUI();
character = charactersList[selectedCharIndex].Character;
isSold = PlayerPrefs.GetInt(selectedCharIndex + "IsSold", 0);
if (selectedCharIndex == 0)
{
if (isSold == 0)
{
PlayerPrefs.SetInt(selectedCharIndex + "IsSold", 1);
}
}
CheckStatus();
CallPlayer();
}
public void CallPlayer()
{
currentCharacter = Instantiate(character, new Vector3(-2.403f, -0.6f, 0f), Quaternion.identity);
}
private void Update()
{
StartCoroutine(SaveCharacter());
}
void CheckStatus()
{
moneyAmount = (int)PlayerPrefs.GetFloat("MoneyAmount");
isSold = PlayerPrefs.GetInt(selectedCharIndex + "IsSold", 0);
if (moneyAmount >= 0)
{
buyButton.interactable = true;
}
else
{
buyButton.interactable = false;
}
if (isSold == 1)
{
buyButton.gameObject.SetActive(false);
}
else
{
buyButton.gameObject.SetActive(true);
}
Debug.Log(moneyAmount);
Debug.Log(isSold);
}
public void LeftArrow()
{
moneyAmountText.text = moneyAmount.ToString() + "$";
audioManager.play("SFX");
selectedCharIndex--;
if (selectedCharIndex < 0)
{
selectedCharIndex = charactersList.Count - 1;
}
CheckStatus();
UpdateCharacterUI();
}
public void RightArrow()
{
moneyAmountText.text = moneyAmount.ToString() + "$";
audioManager.play("SFX");
selectedCharIndex++;
if (selectedCharIndex == charactersList.Count)
{
selectedCharIndex = 0;
}
CheckStatus();
UpdateCharacterUI();
}
public void Buy()
{
audioManager.play("Unlocked");
moneyAmount -= 0;
PlayerPrefs.SetInt(selectedCharIndex + "IsSold", 1);
buyButton.gameObject.SetActive(false);
PlayerPrefs.SetFloat("MoneyAmount", moneyAmount);
moneyAmountText.text = moneyAmount.ToString() + "$";
}
IEnumerator transition()
{
yield return new WaitForSeconds(2f);
Price.text = "Sold!";
}
public void Confirm()
{
audioManager.play("Confirm");
PlayerPrefs.SetInt("Player", selectedCharIndex);
Debug.Log(string.Format("Character{0}:{1} has been choosen", selectedCharIndex, charactersList[selectedCharIndex].CharName));
character = charactersList[selectedCharIndex].Character;
ChangeCharacter();
}
void ChangeCharacter()
{
Vector3 currentPosition = currentCharacter.transform.position;
Destroy(currentCharacter);
currentCharacter = Instantiate(character, currentPosition, Quaternion.identity);
cameraFollow = GameObject.FindGameObjectWithTag("MainCamera").GetComponent<CameraFollow>();
cameraFollow.GetPlayer(currentCharacter);
}
IEnumerator SaveCharacter()
{
if (saveChar)
{
saveChar = false;
yield return new WaitForSeconds(0.05f);
currentCharacter = Instantiate(character, new Vector3(-2.47699f, 0.169f, 0), Quaternion.identity);
cameraFollow = GameObject.FindGameObjectWithTag("MainCamera").GetComponent<CameraFollow>();
cameraFollow.GetPlayer(currentCharacter);
}
}
}
For the levelManager:
prvoid Start()
{
_CharacterSelect = FindObjectOfType<_CharacterSelect>();
audioManager = FindObjectOfType<AudioManager>();
selectLevel = FindObjectOfType<SelecLevel>();
gameManager = FindObjectOfType<GameManager>();
FillList();
}
void FillList()
{
Index = 0;
for (int i = 0; i < selectLevel.Levels; i++)
{
LevelButton levelButton = Instantiate(TheButton, Spacer).GetComponent<LevelButton>();
levelButton.LevelIndex = Index;
levelButton.button.onClick.AddListener(() => SelectLevel(levelButton.LevelIndex));
Index++;
}
}
void DeleteAll()
{
PlayerPrefs.DeleteAll();
Application.LoadLevel(0);
}
void SelectLevel(int index)
{
_CharacterSelect.saveChar = true;
selectLevel.levelIndex = index;
Application.LoadLevel("Level " + (index + 1));
switch (selectLevel.levelIndex)
{
case 1:
audioManager.StopPlay("BGM");
audioManager.play("BGM1");
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
}
}
public void ReseData()
{
DeleteAll();
}
}
the last GameManager :
private void Start()
{
audioManager = FindObjectOfType<AudioManager>();
//questionManager = FindObjectOfType<_questionManager>();
LevelSelect = FindObjectOfType<SelecLevel>();
Select = FindObjectOfType<_CharacterSelect>();
sliderChanges = FindObjectOfType<SliderChanges>();
onlepel = LevelSelect.levelIndex + 1;
IndexLevel = LevelSelect.levelIndex;
getPlayerData();
Timecount = GameObject.FindGameObjectWithTag("TimeCount");
category = FindObjectOfType<_questionManager>().category;
moneyAmount = PlayerPrefs.GetFloat("MoneyAmount");
if (unansweredQuestion == null || unansweredQuestion.Count == 0)
{
thisQuestions = category[IndexLevel].questions;
unansweredQuestion = new List<Question>(thisQuestions);
//TrueAnswerText.text = "CORRECT";
//FalseAnswerText.text = "WRONG!";
//unansweredQuestion = new List<Question>(questions);
}
TrueCount = 0;
if (FactText != null)
setCurrentQuestion();
}
private void Update()
{
moneyText.text = moneyAmount.ToString() + "$";
}
#region MainQuestion
public void getPlayerData()
{
levelindexPlayerPrefs = PlayerPrefs.GetInt("LevelIndex", 0);
}
public void updateLevel(int Index)
{
if (levelindexPlayerPrefs < Index)
{
PlayerPrefs.SetInt("LevelIndex", Index);
levelindexPlayerPrefs = PlayerPrefs.GetInt("LevelIndex");
}
}
public void setCurrentQuestion()
{
Scoretext.text = TrueCount.ToString() + " / " + thisQuestions.Length.ToString();
RandomQuestionIndex = Random.Range(0, unansweredQuestion.Count);
currentQuestion = unansweredQuestion[RandomQuestionIndex];
FactText.text = currentQuestion.fact;
//IsQuestionAvailable = true;
sliderChanges.TimeRemaining = sliderChanges.TimeMax;
}
public IEnumerator TransitionToNextQuestion()
{
unansweredQuestion.Remove(currentQuestion);
answerQuestion = false;
if (unansweredQuestion.Count == 0 || unansweredQuestion == null)
{
count = thisQuestions.Length;
changeLevel = false;
thisQuestions = category[IndexLevel].questions;
unansweredQuestion = new List<Question>(thisQuestions);
//unansweredQuestion = new List<Question>(questions);
count++;
if (count == thisQuestions.Length || CurrentTrueCount == thisQuestions.Length) ;
{
Scoretext.text = TrueCount.ToString() + " / " + thisQuestions.Length.ToString();
changeLevel = true;
//Objective.SetActive(true);
StartCoroutine(EndGame());
Timecount.SetActive(false);
StartCoroutine(EveryChapter());
}
}
yield return new WaitForSeconds(.5f);
setCurrentQuestion();
}
public IEnumerator EndGame()
{
int Currentstar = PlayerPrefs.GetInt("Level" + (IndexLevel + 1));
PlayerPrefs.SetFloat("MoneyAmount", moneyAmount);
if (TrueCount < thisQuestions.Length || TrueCount == thisQuestions.Length - 5)
{
if (Currentstar < 1)
PlayerPrefs.SetInt("Level" + (IndexLevel + 1), 1);
changeLevel = true;
yield return new WaitForSeconds(1f);
Objective.SetActive(true);
yield return new WaitForSeconds(.3f);
audioManager.play("Stars");
Star1.SetActive(true);
}
if (TrueCount > thisQuestions.Length - 4 || CurrentTrueCount <= thisQuestions.Length - 3)
{
if (Currentstar < 2)
PlayerPrefs.SetInt("Level" + (IndexLevel + 1), 2);
changeLevel = true;
yield return new WaitForSeconds(1f);
Objective.SetActive(true);
yield return new WaitForSeconds(.3f);
audioManager.play("Stars");
Star2.SetActive(true);
}
if (TrueCount > thisQuestions.Length - 2 || TrueCount == thisQuestions.Length)
{
if (Currentstar < 3)
PlayerPrefs.SetInt("Level" + (IndexLevel + 1), 3);
changeLevel = true;
yield return new WaitForSeconds(1f);
Objective.SetActive(true);
yield return new WaitForSeconds(.3f);
audioManager.play("Stars");
Star1.SetActive(true);
audioManager.play("Stars");
Star3.SetActive(true);
}
updateLevel(IndexLevel + 1);
getPlayerData();
Debug.Log(levelindexPlayerPrefs);
}
IEnumerator EveryChapter()
{
Scoretext.text = TrueCount.ToString() + " / " + thisQuestions.Length.ToString();
yield return new WaitForSeconds(7f);
}
public void HandleAnswerButton(bool answer)
{
//IsQuestionAvailable = false;
enemyGenerator.SpawnEnemy();
sliderChanges.TimeRemaining = 0;
FactText.text = string.Empty;
if (answer)
{
animator[0].SetTrigger("click");
if (currentQuestion.isTrue)
{
TrueAnswerText.text = "CORRECT";
moneyAmount += .5f;
answerQuestion = true;
TrueCount++;
Isbattle = true;
//Scoretext.text = TrueCount.ToString() + " / " + thisQuestions.Length.ToString();
}
else
{
TrueAnswerText.text = "WRONG!";
Debug.Log("Wrong!");
}
}
if (!answer)
{
animator[1].SetTrigger("Clack");
if (!currentQuestion.isTrue)
{
FalseAnswerText.text = "CORRECT";
moneyAmount += .5f;
Isbattle = false;
answerQuestion = true;
TrueCount++;
Debug.Log("Correct");
Debug.Log(TrueCount);
//Scoretext.text = TrueCount.ToString() + " / " + thisQuestions.Length.ToString();
}
else
{
FalseAnswerText.text = "WRONG!";
Debug.Log("Wrong!");
}
}
Scoretext.text = TrueCount.ToString() + " / " + thisQuestions.Length.ToString();
//StartCoroutine(TransitionToNextQuestion());
}
#endregion
#region Panels
public void Paused()
{
StartCoroutine(Pause());
PausePanel.SetActive(true);
}
IEnumerator Pause()
{
audioManager.play("Confirm");
yield return new WaitForSeconds(.3f);
Time.timeScale = 0f;
}
public void Resume()
{
audioManager.play("Close");
Time.timeScale = 1f;
PausePanel.SetActive(false);
}
public void Back()
{
audioManager.play("Close");
}
public void Confirm()
{
audioManager.play("Confirm");
}
public void Dead()
{
sliderChanges.gameObject.SetActive(false);
DeadPanel.SetActive(true);
HealthBar.SetActive(false);
PauseButton.SetActive(false);
Scoretext.gameObject.SetActive(false);
GoldField.SetActive(false);
Select.saveChar = true;
}
public void TheOptionPanel()
{
audioManager.play("Confirm");
OptionPanel.SetActive(true);
}
public void PG_MainMenu()
{
audioManager.play("Confirm");
PlayGame.SetActive(true);
}
public void ExitGame()
{
audioManager.play("Confirm");
Application.Quit();
}
#endregion
#region TransitionToNextScene
public void ToTheTown()
{
audioManager.StopPlay("BGM1");
audioManager.play("BGM");
audioManager.play("Confirm");
SceneManager.LoadScene(0);
Time.timeScale = 1f;
}
public void NExtLevel()
{
LevelSelect.levelIndex++;
Select.saveChar = true;
audioManager.play("Confirm");
onlepel += 1;
SceneManager.LoadScene("Level " + onlepel);
switch (LevelSelect.levelIndex)
{
case 1:
audioManager.StopPlay("BGM");
audioManager.play("BGM1");
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
}
}
public void restart()
{
audioManager.play("Confirm");
Select.saveChar = true;
Time.timeScale = 1f;
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
#endregion

solved,
it's confusing me all night though
:'D
but it's because I'm just not setting the playerprefs at Savecharacter line at Character select script
selectedCharIndex = PlayerPrefs.GetInt("Player");
character = charactersList[selectedCharIndex].Character;

Related

IndexOutOfRangeException: Can't figure out why index out of bound

So, I have a list of Upgrade systems for my game but it has a bug on it when I press upgrade for a second time the index out of range then pressed for the third times the index out of range gone. this whole script.
void Start()
{
newSelectedIndex = previousSelectedIndex = PlayerPrefs.GetInt("currentPlayer");
btn = Select_Player[newSelectedIndex].GetComponent<Button>();
btn.interactable = false;
Coins = M_CoinManager.instance.Coins;
for (int i = 0; i < Select_Player.Length; i++)
{
priceText[i].text = Cost_Player[i].ToString();
value_player[i] = "" + i;
Select_Player[i].SetActive(false);
buyPlayer[i] = PlayerPrefs.GetInt(value_player[i]);
}
//if(PlayerPrefs.HasKey("currentPlayer")){
selectedVehicleIndex = PlayerPrefs.GetInt("currentPlayer");
theVehicles[selectedVehicleIndex].SetActive(true);
VehicleInfo();
UpgradeButtonStatus();
}
// Update is called once per frame
void Update()
{
for (int i = 0; i < Select_Player.Length; i++)
{
buyPlayer[i] = PlayerPrefs.GetInt(value_player[i]);
if (i == buyPlayer[i])
{
Select_Player[i].SetActive(true);
upgradeBtn[i].interactable = true;
UpgradeButtonStatus();
}
else
{
upgradeBtn[i].interactable = false;
}
}
}
public void BuyCharact(int id)
{
M_SoundManager.instance.playUIsfx();
if (Cost_Player[id] <= Coins)
{
M_CoinManager.instance.AddCoins(-Cost_Player[id]);
PlayerPrefs.SetInt(value_player[id], id);
}
else
{
_CoinShake.DoShake();
Debug.Log("Does have enough coin");
}
}
public void Reset()
{
for (int i = 0; i < Select_Player.Length; i++)
{
PlayerPrefs.SetInt(value_player[i], 0);
}
}
public void Select(int id)
{
previousSelectedIndex = newSelectedIndex;
newSelectedIndex = id;
newSelectedIndex = selectedVehicleIndex;
PlayerPrefs.SetInt("currentPlayer", newSelectedIndex);
Button newbtn = Select_Player[previousSelectedIndex].GetComponent<Button>();
btn = Select_Player[newSelectedIndex].GetComponent<Button>();
btn.interactable = false;
newbtn.interactable = true;
M_SoundManager.instance.playUIsfx();
Debug.Log("Selected TypeCar" + newSelectedIndex);
}
public void nextVehicle()
{
M_SoundManager.instance.playUIsfx();
theVehicles[selectedVehicleIndex].SetActive(false);
selectedVehicleIndex = (selectedVehicleIndex + 1) % theVehicles.Length;
theVehicles[selectedVehicleIndex].SetActive(true);
VehicleInfo();
UpgradeButtonStatus();
}
public void PreviousVehicle()
{
M_SoundManager.instance.playUIsfx();
theVehicles[selectedVehicleIndex].SetActive(false);
selectedVehicleIndex--;
if (selectedVehicleIndex < 0)
{
selectedVehicleIndex += theVehicles.Length;
}
theVehicles[selectedVehicleIndex].SetActive(true);
VehicleInfo();
UpgradeButtonStatus();
}
public void VehicleInfo()
{
currLevel = _VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel;
levelText[selectedVehicleIndex].text = "Level: " + (currLevel + 1);
powerText[selectedVehicleIndex].text = "Power: " + _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel[currLevel].motorPower;
brakeText[selectedVehicleIndex].text = "Brake: " + _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel[currLevel].brakePower;
Debug.Log(selectedVehicleIndex);
}
public void upgradeMethod()
{
nextLevelIndex = _VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel + 1;
if (Coins >= _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel[nextLevelIndex].unlockCost)
{
Coins -= _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel[nextLevelIndex].unlockCost;
_VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel++;
if (_VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel < _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel.Length - 1)
{
upgradeBtnText[selectedVehicleIndex].text = "Upgrade Cost :" + _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel[nextLevelIndex + 1].unlockCost;
}
else
{
upgradeBtn[selectedVehicleIndex].interactable = false;
upgradeBtnText[selectedVehicleIndex].text = "Max Level";
}
VehicleInfo();
}
}
private void UpgradeButtonStatus()
{
if (_VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel < _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel.Length - 1)
{
upgradeBtn[selectedVehicleIndex].interactable = true;
nextLevelIndex = _VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel + 1;
upgradeBtnText[selectedVehicleIndex].text = "Upgrade Cost :" + _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel[nextLevelIndex + 1].unlockCost;
}
else
{
upgradeBtn[selectedVehicleIndex].interactable = false;
upgradeBtnText[selectedVehicleIndex].text = "Max Level";
}
}
and the error reference to this method :
private void UpgradeButtonStatus()
{
if (_VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel < _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel.Length - 1)
{
upgradeBtn[selectedVehicleIndex].interactable = true;
nextLevelIndex = _VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel + 1;
upgradeBtnText[selectedVehicleIndex].text = "Upgrade Cost :" + _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel[nextLevelIndex + 1].unlockCost;
}
else
{
upgradeBtn[selectedVehicleIndex].interactable = false;
upgradeBtnText[selectedVehicleIndex].text = "Max Level";
}
}
as you can see on the update that's what I mean. after i press upgrade for third times the error stopped.
and this for the inpector
Arrays length is one higher than their highest index, but last iteration of "for" loops goes to array.length.
You need to make "for" loops to array.length-1.
I see you do "for" loops of up to array.length.
I haven't truly read thru your whole script so there might be more, but it's a typical error in my "for" loops so I think that is causing your error.

2D procedural dungeon generation game

I am currently messing around with a procedural 2D game in unity. Below are the scripts i am using to generate the dungeon and wanted to know if there was anyway of specifying a standard starting room. I have prefab room built but would like to have a single prefab room players always start in.
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Tilemaps;
public class DungeonGeneration : MonoBehaviour {
[SerializeField]
private int numberOfRooms;
[SerializeField]
private int numberOfObstacles;
[SerializeField]
private Vector2Int[] possibleObstacleSizes;
[SerializeField]
private int numberOfEnemies;
[SerializeField]
private GameObject[] possibleEnemies;
[SerializeField]
private GameObject goalPrefab;
[SerializeField]
private TileBase obstacleTile;
private Room[,] rooms;
private Room currentRoom;
private static DungeonGeneration instance = null;
void Awake () {
if (instance == null) {
DontDestroyOnLoad (this.gameObject);
instance = this;
this.currentRoom = GenerateDungeon ();
} else {
string roomPrefabName = instance.currentRoom.PrefabName ();
GameObject roomObject = (GameObject) Instantiate (Resources.Load (roomPrefabName));
Tilemap tilemap = roomObject.GetComponentInChildren<Tilemap> ();
instance.currentRoom.AddPopulationToTilemap (tilemap, instance.obstacleTile);
Destroy (this.gameObject);
}
}
void Start () {
string roomPrefabName = this.currentRoom.PrefabName ();
GameObject roomObject = (GameObject) Instantiate (Resources.Load (roomPrefabName));
Tilemap tilemap = roomObject.GetComponentInChildren<Tilemap> ();
this.currentRoom.AddPopulationToTilemap (tilemap, this.obstacleTile);
}
private Room GenerateDungeon() {
int gridSize = 3 * numberOfRooms;
rooms = new Room[gridSize, gridSize];
Vector2Int initialRoomCoordinate = new Vector2Int ((gridSize / 2) - 1, (gridSize / 2) - 1);
Queue<Room> roomsToCreate = new Queue<Room> ();
roomsToCreate.Enqueue (new Room(initialRoomCoordinate.x, initialRoomCoordinate.y));
List<Room> createdRooms = new List<Room> ();
while (roomsToCreate.Count > 0 && createdRooms.Count < numberOfRooms) {
Room currentRoom = roomsToCreate.Dequeue ();
this.rooms [currentRoom.roomCoordinate.x, currentRoom.roomCoordinate.y] = currentRoom;
createdRooms.Add (currentRoom);
AddNeighbors (currentRoom, roomsToCreate);
}
int maximumDistanceToInitialRoom = 0;
Room finalRoom = null;
foreach (Room room in createdRooms) {
List<Vector2Int> neighborCoordinates = room.NeighborCoordinates ();
foreach (Vector2Int coordinate in neighborCoordinates) {
Room neighbor = this.rooms [coordinate.x, coordinate.y];
if (neighbor != null) {
room.Connect (neighbor);
}
}
room.PopulateObstacles (this.numberOfObstacles, this.possibleObstacleSizes);
room.PopulatePrefabs (this.numberOfEnemies, this.possibleEnemies);
int distanceToInitialRoom = Mathf.Abs (room.roomCoordinate.x - initialRoomCoordinate.x) + Mathf.Abs(room.roomCoordinate.y - initialRoomCoordinate.y);
if (distanceToInitialRoom > maximumDistanceToInitialRoom) {
maximumDistanceToInitialRoom = distanceToInitialRoom;
finalRoom = room;
}
}
GameObject[] goalPrefabs = { this.goalPrefab };
finalRoom.PopulatePrefabs(1, goalPrefabs);
return this.rooms [initialRoomCoordinate.x, initialRoomCoordinate.y];
}
private void AddNeighbors(Room currentRoom, Queue<Room> roomsToCreate) {
List<Vector2Int> neighborCoordinates = currentRoom.NeighborCoordinates ();
List<Vector2Int> availableNeighbors = new List<Vector2Int> ();
foreach (Vector2Int coordinate in neighborCoordinates) {
if (this.rooms[coordinate.x, coordinate.y] == null) {
availableNeighbors.Add (coordinate);
}
}
int numberOfNeighbors = (int)Random.Range (1, availableNeighbors.Count);
for (int neighborIndex = 0; neighborIndex < numberOfNeighbors; neighborIndex++) {
float randomNumber = Random.value;
float roomFrac = 1f / (float)availableNeighbors.Count;
Vector2Int chosenNeighbor = new Vector2Int(0, 0);
foreach (Vector2Int coordinate in availableNeighbors) {
if (randomNumber < roomFrac) {
chosenNeighbor = coordinate;
break;
} else {
roomFrac += 1f / (float)availableNeighbors.Count;
}
}
roomsToCreate.Enqueue (new Room(chosenNeighbor));
availableNeighbors.Remove (chosenNeighbor);
}
}
private void PrintGrid() {
for (int rowIndex = 0; rowIndex < this.rooms.GetLength (1); rowIndex++) {
string row = "";
for (int columnIndex = 0; columnIndex < this.rooms.GetLength (0); columnIndex++) {
if (this.rooms [columnIndex, rowIndex] == null) {
row += "X";
} else {
row += "R";
}
}
Debug.Log (row);
}
}
public void MoveToRoom(Room room) {
this.currentRoom = room;
}
public Room CurrentRoom() {
return this.currentRoom;
}
public void ResetDungeon() {
this.currentRoom = GenerateDungeon ();
}
}
and
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Tilemaps;
public class Room
{
public Vector2Int roomCoordinate;
public Dictionary<string, Room> neighbors;
private string[,] population;
private Dictionary<string, GameObject> name2Prefab;
public Room (int xCoordinate, int yCoordinate)
{
this.roomCoordinate = new Vector2Int (xCoordinate, yCoordinate);
this.neighbors = new Dictionary<string, Room> ();
this.population = new string[18, 10];
for (int xIndex = 0; xIndex < 18; xIndex += 1) {
for (int yIndex = 0; yIndex < 10; yIndex += 1) {
this.population [xIndex, yIndex] = "";
}
}
this.population [8, 5] = "Player";
this.name2Prefab = new Dictionary<string, GameObject> ();
}
public Room (Vector2Int roomCoordinate)
{
this.roomCoordinate = roomCoordinate;
this.neighbors = new Dictionary<string, Room> ();
this.population = new string[18, 10];
for (int xIndex = 0; xIndex < 18; xIndex += 1) {
for (int yIndex = 0; yIndex < 10; yIndex += 1) {
this.population [xIndex, yIndex] = "";
}
}
this.population [8, 5] = "Player";
this.name2Prefab = new Dictionary<string, GameObject> ();
}
public List<Vector2Int> NeighborCoordinates () {
List<Vector2Int> neighborCoordinates = new List<Vector2Int> ();
neighborCoordinates.Add (new Vector2Int(this.roomCoordinate.x, this.roomCoordinate.y - 1));
neighborCoordinates.Add (new Vector2Int(this.roomCoordinate.x + 1, this.roomCoordinate.y));
neighborCoordinates.Add (new Vector2Int(this.roomCoordinate.x, this.roomCoordinate.y + 1));
neighborCoordinates.Add (new Vector2Int(this.roomCoordinate.x - 1, this.roomCoordinate.y));
return neighborCoordinates;
}
public void Connect (Room neighbor) {
string direction = "";
if (neighbor.roomCoordinate.y < this.roomCoordinate.y) {
direction = "N";
}
if (neighbor.roomCoordinate.x > this.roomCoordinate.x) {
direction = "E";
}
if (neighbor.roomCoordinate.y > this.roomCoordinate.y) {
direction = "S";
}
if (neighbor.roomCoordinate.x < this.roomCoordinate.x) {
direction = "W";
}
this.neighbors.Add (direction, neighbor);
}
public string PrefabName () {
string name = "Room_";
foreach (KeyValuePair<string, Room> neighborPair in neighbors) {
name += neighborPair.Key;
}
return name;
}
public Room Neighbor (string direction) {
return this.neighbors [direction];
}
public void PopulateObstacles (int numberOfObstacles, Vector2Int[] possibleSizes) {
for (int obstacleIndex = 0; obstacleIndex < numberOfObstacles; obstacleIndex += 1) {
int sizeIndex = Random.Range (0, possibleSizes.Length);
Vector2Int regionSize = possibleSizes [sizeIndex];
List<Vector2Int> region = FindFreeRegion (regionSize);
foreach (Vector2Int coordinate in region) {
this.population [coordinate.x, coordinate.y] = "Obstacle";
}
}
}
public void PopulatePrefabs (int numberOfPrefabs, GameObject[] possiblePrefabs) {
for (int prefabIndex = 0; prefabIndex < numberOfPrefabs; prefabIndex += 1) {
int choiceIndex = Random.Range (0, possiblePrefabs.Length);
GameObject prefab = possiblePrefabs [choiceIndex];
List<Vector2Int> region = FindFreeRegion (new Vector2Int(1, 1));
this.population [region[0].x, region[0].y] = prefab.name;
this.name2Prefab [prefab.name] = prefab;
}
}
private List<Vector2Int> FindFreeRegion (Vector2Int sizeInTiles) {
List<Vector2Int> region = new List<Vector2Int>();
do {
region.Clear();
Vector2Int centerTile = new Vector2Int(UnityEngine.Random.Range(2, 18 - 3), UnityEngine.Random.Range(2, 10 - 3));
region.Add(centerTile);
int initialXCoordinate = (centerTile.x - (int)Mathf.Floor(sizeInTiles.x / 2));
int initialYCoordinate = (centerTile.y - (int)Mathf.Floor(sizeInTiles.y / 2));
for (int xCoordinate = initialXCoordinate; xCoordinate < initialXCoordinate + sizeInTiles.x; xCoordinate += 1) {
for (int yCoordinate = initialYCoordinate; yCoordinate < initialYCoordinate + sizeInTiles.y; yCoordinate += 1) {
region.Add(new Vector2Int(xCoordinate, yCoordinate));
}
}
} while(!IsFree (region));
return region;
}
private bool IsFree (List<Vector2Int> region) {
foreach (Vector2Int tile in region) {
if (this.population [tile.x, tile.y] != "") {
return false;
}
}
return true;
}
public void AddPopulationToTilemap (Tilemap tilemap, TileBase obstacleTile) {
for (int xIndex = 0; xIndex < 18; xIndex += 1) {
for (int yIndex = 0; yIndex < 10; yIndex += 1) {
if (this.population [xIndex, yIndex] == "Obstacle") {
tilemap.SetTile (new Vector3Int (xIndex - 9, yIndex - 5, 0), obstacleTile);
} else if (this.population [xIndex, yIndex] != "" && this.population [xIndex, yIndex] != "Player") {
GameObject prefab = GameObject.Instantiate (this.name2Prefab[this.population [xIndex, yIndex]]);
prefab.transform.position = new Vector2 (xIndex - 9 + 0.5f, yIndex - 5 + 0.5f);
}
}
}
}
}
any help would be awesome even if you can point me in the direction to a how to.
Nice procedural dungeon generator! Just as a suggestion, could you cache the first room at the beginning when you are generating the dungeon? Then you can grab the initialRoomForPlayerSpawn coordinates/ position as a reference point for the character placement.
Room initialRoomForPlayerSpawn = null;
while (roomsToCreate.Count > 0 && createdRooms.Count < numberOfRooms) {
Room currentRoom = roomsToCreate.Dequeue ();
this.rooms [currentRoom.roomCoordinate.x, currentRoom.roomCoordinate.y] = currentRoom;
createdRooms.Add (currentRoom);
AddNeighbors (currentRoom, roomsToCreate);
/* Cache First Room */
if(createdRooms != null && createdRooms.Count <= 1) {
initialRoomForPlayerSpawn = currentRoom;
}
}

Why Can't I instatiate my object in the position that want at unity?

I'm trying instantiate a sphere to use like a bullet. I want that the bullet be align like the image bellow:
the desirable situation
but when I instantiate through interactive way a have a problem, The sphere stay in diferente coordinate completely different of that I instantiated previouslly. look at the image:
the real situation
why does it happen? how can I solve it?
follow the code from Player.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Player
{
public string name;
int currentLife;
int maxLife;
int mentalPower;
public GameObject obj3d; // variável de referência ao modelo 3d do player
// métodos
public Player(string nome, int vidaTotal, int forcaMental)
{
name = nome;
maxLife = vidaTotal;
currentLife = maxLife;
mentalPower = forcaMental;
}
public int Atack(ref bool critico)
{
int aux = mentalPower / 2;
int damage = mentalPower + Random.Range(-aux, aux);
int critical = Random.Range(0, 100);
if(critical < 5) // ataque critico
{
critico = true;
damage *= 2;
}
else
{
critico = false;
}
return (damage);
}
public bool UpdateLife(int dano)
{
currentLife -= dano;
if (currentLife < 0)
{
//comando para destruir o objeto
Object.Destroy(obj3d);
return false;
}
else
return true;
}
public int getLife(int tipo)
{
if (tipo == 0)
return currentLife;
else
return maxLife;
}
public string getName(Player player)
{
return player.name;
}
}
from the Battle.cs:
`using System.Collections;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class Battle : MonoBehaviour
{
Player[] players;
int status; // -1= game não começou,0 =game rolando, 1= player 1 vencedor , 2 = player 2 venceu.
Vector3[] spawnPoints;
Quaternion[] rotSpawnPoints;
Color[] playerColors;
public GameObject myPrefab;
Text titulo, info, lifePlayer1, lifePlayer2;
// Bullet
public GameObject objBullet;
Vector3 spawBullet;
// Start is called before the first frame update
void Start()
{
players = new Player[2];
status = -1;
spawnPoints = new Vector3[2];
spawnPoints[0] = new Vector3(2.24f, 0.97f, -4.46f);
spawnPoints[1] = new Vector3(-6.13f, 0.8f, 3.79f);
rotSpawnPoints = new Quaternion[2];
rotSpawnPoints[0] = Quaternion.Euler(0.0f, -250.0f, 0.0f);
rotSpawnPoints[1] = Quaternion.Euler(0.0f, -75.0f, 0.0f);
playerColors = new Color[2];
playerColors[0] = Color.blue;
playerColors[1] = Color.red;
titulo = GameObject.Find("Title").GetComponent<Text>();
info = GameObject.Find("Info").GetComponent<Text>();
lifePlayer1 = GameObject.Find("LifePlayer1").GetComponent<Text>();
lifePlayer2 = GameObject.Find("LifePlayer2").GetComponent<Text>();
spawBullet = new Vector3(1.268f, 1.45f, -3.763f);
}
void CreatePlayer(int nPlayer)
{
print("Entrou na Create Player() com arg = " + nPlayer);
players[nPlayer - 1].obj3d = (GameObject)Instantiate(myPrefab, spawnPoints[nPlayer - 1], rotSpawnPoints[nPlayer - 1]);
players[nPlayer - 1].obj3d.name = "Player" + nPlayer;
players[nPlayer - 1].obj3d.GetComponent<MeshRenderer>().material.color = playerColors[nPlayer - 1];
ControlaInterface();
}
void ControlaCritico(bool status)
{
if (status == true)
{
GameObject.Find("Title").GetComponent<Text>().enabled = true;
GameObject.Find("Title").GetComponent<Text>().color = new Color(GameObject.Find("Title").GetComponent<Text>().color.r, GameObject.Find("Title").GetComponent<Text>().color.g,
GameObject.Find("Title").GetComponent<Text>().color.b, 255f);
GameObject.Find("Title").GetComponent<Text>().text = "CRITOU URRUUU!!!!";
}
else
GameObject.Find("Title").GetComponent<Text>().enabled = false;
}
void ControlaInterface()
{
print("entrei na controla inter");
if(players[0] == null)// entra aqui quando aperta F2
{
print("entrou primeiro if");
GameObject.Find("Title").GetComponent<Text>().text = " Aguardando\nPlayer 1 Azul";
lifePlayer2.enabled = true;
lifePlayer2.text = players[1].getLife(0).ToString() + "/" + players[1].getLife(1).ToString();
}
else if(players[1] == null)// entra aqui quando aperta F1
{
print("entrou segundo if");
GameObject.Find("Title").GetComponent<Text>().text = " Aguardando\nPlayer 2 Vemelho";
lifePlayer1.enabled = true;
lifePlayer1.text = players[0].getLife(0).ToString() + "/" + players[0].getLife(1).ToString();
}
else // player 0 e 1 são diferentes de null
{
print("entrou no else");
lifePlayer2.enabled = true;
lifePlayer1.enabled = true;
lifePlayer2.text = players[1].getLife(0).ToString() + "/" + players[0].getLife(1).ToString();
lifePlayer1.text = players[0].getLife(0).ToString() + "/" + players[1].getLife(1).ToString();
GameObject.Find("Title").GetComponent<Text>().enabled = false;
if (status == -1)
status = 0;
}
GameObject objTmp = null;
}
// Update is called once per frame
void Update()
{
if (status == -1)
titulo.color = new Color(titulo.color.r, titulo.color.g, titulo.color.b,Mathf.Sin(Time.time*2.0f +1.0f)/2.0f) ;
if (Input.GetKeyDown(KeyCode.F1)) //criar player 1(Azul)
{
if (players[0] == null)
{
players[0] = new Player("Player 1 Azul", 100, 14);
CreatePlayer(1);
//GameObject.Find("Title").GetComponent<Text>().enabled = false;
}
}
//-4.87f, 0.8f, -4.83f
if(Input.GetKeyDown(KeyCode.F10))// reseta o game
{
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
if (Input.GetKeyDown(KeyCode.F2)) //criar player 2(vermelho)
{
if (players[1] == null)
{
players[1] = new Player("Player 2 Vermelho", 100, 14);
CreatePlayer(2);
// GameObject.Find("Title").GetComponent<Text>().enabled = false;
}
}
if (Input.GetKeyDown(KeyCode.Alpha1)) // ataque do player 1
{
//if (objTmp == null)
GameObject objTmp = (GameObject)Instantiate(objBullet, new Vector3(-0.52f, 0.4f, 0.57f), Quaternion.Euler(0f, -45f, 0f));
objTmp.transform.parent = players[0].obj3d.transform;
objTmp.transform.localPosition = spawBullet;
}
}
//-4.87f, 0.8f, -4.83f
if (Input.GetKeyDown(KeyCode.Alpha2)) //ataque player 2(vermelho)
{
// if(objTmp == null)
GameObject objTmp = (GameObject)Instantiate(objBullet, new Vector3(-4.5f, 0.3f, 5.514f), Quaternion.Euler(0f, -45f, 0f));
objTmp.transform.parent = players[1].obj3d.transform;
objTmp.transform.localPosition = spawBullet;
}
}
}
`

Unity 5 Inventory system not working

Hello programmers all around the world. I have made myself an inventory system for my game. Only problem is that when I click on item and then drag it to and empty slot it doesn't move and I kinda don't see the error which I am having and I have tried to debug it but without success any help? Here is the code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class Inventory : MonoBehaviour {
private RectTransform inventoryRect;
private float inventoryWidth;
private float inventoryHeight;
public int slots;
public int rows;
public float slotPaddingLeft;
public float slotPaddingTop;
public float slotSize;
public GameObject slotPrefab;
private static Slot from;
private static Slot to;
private List<GameObject> allslots;
public GameObject iconPrefab;
private static GameObject hoverObject;
private static int emptySlots;
public Canvas canvas;
private float hoverYOffset;
private bool isPressed;
public EventSystem eventSystem;
public static int EmptySlots{
get{ return emptySlots;}
set{ emptySlots = value;}
}
// Use this for initialization
void Start () {
CreateLayout ();
canvas.enabled = false;
isPressed = false;
}
// Update is called once per frame
void Update () {
if (Input.GetKeyDown (KeyCode.I)) {
if (Input.GetKeyDown (KeyCode.I)) {
canvas.enabled = false;
}
canvas.enabled = true;
}
if (Input.GetMouseButtonUp (0)) {
if (!eventSystem.IsPointerOverGameObject (-1) && from != null) {
from.GetComponent<Image> ().color = Color.white;
from.ClearSlot ();
Destroy (GameObject.Find ("Hover"));
to = null;
from = null;
hoverObject = null;
}
}
if (hoverObject != null) {
Vector2 position;
RectTransformUtility.ScreenPointToLocalPointInRectangle (canvas.transform as RectTransform, Input.mousePosition, canvas.worldCamera, out position);
position.Set (position.x, position.y - hoverYOffset);
hoverObject.transform.position = canvas.transform.TransformPoint (position);
}
}
private void CreateLayout(){
allslots = new List<GameObject> ();
hoverYOffset = slotSize * 0.01f;
emptySlots = slots;
inventoryWidth = (slots / rows) * (slotSize + slotPaddingLeft) + slotPaddingLeft;
inventoryHeight = rows * (slotSize + slotPaddingTop) + slotPaddingTop;
inventoryRect = GetComponent<RectTransform> ();
inventoryRect.SetSizeWithCurrentAnchors (RectTransform.Axis.Horizontal, inventoryWidth);
inventoryRect.SetSizeWithCurrentAnchors (RectTransform.Axis.Vertical, inventoryHeight);
int colums = slots / rows;
for (int y = 0; y < rows; y++) {
for (int x = 0; x < colums; x++) {
GameObject newSlot = (GameObject)Instantiate (slotPrefab);
RectTransform slotRect = newSlot.GetComponent<RectTransform> ();
newSlot.name = "Slot";
newSlot.transform.SetParent (this.transform.parent);
slotRect.localPosition = inventoryRect.localPosition + new Vector3 (slotPaddingLeft * (x + 1) + (slotSize * x), -slotPaddingTop * (y + 1) - (slotSize * y));
slotRect.SetSizeWithCurrentAnchors (RectTransform.Axis.Horizontal, slotSize);
slotRect.SetSizeWithCurrentAnchors (RectTransform.Axis.Vertical, slotSize);
allslots.Add (newSlot);
}
}
}
public bool AddItem(Item item){
if (item.maxSize == 1) {
PlaceEmpty (item);
return true;
}
else {
foreach (GameObject slot in allslots) {
Slot temporary = slot.GetComponent<Slot> ();
if (!temporary.IsEmpty) {
if (temporary.CurrentItem.type == item.type && temporary.IsAvailable) {
temporary.AddItem (item);
return true;
}
}
}
if (emptySlots > 0) {
PlaceEmpty (item);
}
}
return false;
}
private bool PlaceEmpty(Item item){
if (emptySlots > 0) {
foreach (GameObject slot in allslots) {
Slot temporary = slot.GetComponent<Slot> ();
if (temporary.IsEmpty) {
temporary.AddItem (item);
emptySlots--;
return true;
}
}
}
return false;
}
public void MoveItem(GameObject clicked){
if (from == null) {
if (!clicked.GetComponent<Slot> ().IsEmpty) {
from = clicked.GetComponent<Slot> ();
from.GetComponent<Image> ().color = Color.gray;
hoverObject = (GameObject)Instantiate (iconPrefab);
hoverObject.GetComponent<Image> ().sprite = clicked.GetComponent<Image> ().sprite;
hoverObject.name = "Hover";
RectTransform hoverTransform = hoverObject.GetComponent<RectTransform> ();
RectTransform clickedTransform = clicked.GetComponent<RectTransform> ();
hoverTransform.SetSizeWithCurrentAnchors (RectTransform.Axis.Horizontal, clickedTransform.sizeDelta.x);
hoverTransform.SetSizeWithCurrentAnchors (RectTransform.Axis.Vertical, clickedTransform.sizeDelta.y);
hoverObject.transform.SetParent (GameObject.Find ("Canvas").transform, true);
hoverObject.transform.localScale = from.gameObject.transform.localScale;
}
}
else if (to = null) {
to = clicked.GetComponent<Slot> ();
Destroy (GameObject.Find ("Hover"));
}
if (to != null && from != null) {
Stack<Item> tmpTo = new Stack<Item> (to.Items);
to.AddItems (from.Items);
if (tmpTo.Count == 0) {
from.ClearSlot ();
}
else {
from.AddItems (tmpTo);
}
from.GetComponent<Image> ().color = Color.white;
to = null;
from = null;
hoverObject = null;
}
}
}
The method which is causing the problem is the MoveItem() sadly it is not a nullreference or nullpointer and I simply am out of ideas been strugling with it for a couple of days... Any advice on how to fix this would be helpfull and much welcomed indeed. Thanks in advance!
I haven't taken a long look at your code but right away I saw this issue:
else if (to = null) {
to = clicked.GetComponent<Slot> ();
Destroy (GameObject.Find ("Hover"));
}
This is causing the end location to be set to null. To fix this, change to double equals like so:
else if (to == null) {
to = clicked.GetComponent<Slot> ();
Destroy (GameObject.Find ("Hover"));
}
If this does not solve your problem, let me know and I'll look at your code harder.

My Program Creates 1 Ball not 2

I made a program that creates a frame and then creates 2 balls and moves them around seperately, my problem is that somehow the first or second ball is getting the coordinates of the other, and therefore are being painted on each other, sorry for the bad indentation this is my first time posting a question .
Main Class:
public class Game extends JPanel {
Ball ball01 = new Ball();
Ball ball02 = new Ball();
int ball01x = 0,ball01y = 0,ball02x = 0,ball02y = 0;
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g2d.fillOval(ball01x, ball01y, 10, 10);
g2d.setColor(Color.RED);
g2d.fillOval(ball02x, ball02y, 10, 10);
}
public static void main(String[] args) throws InterruptedException {
JFrame frame = new JFrame("Sample Frame");
Game game = new Game();
frame.add(game);
frame.setSize(400, 400);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
game.createBalls();
while (true) {
game.getCoords();
game.updateBalls();
game.repaint();
System.out.println("Ball01 x: " + game.ball01x + " Ball02 x " + game.ball02x);
Thread.sleep(10);
}
}
public void getCoords(){
ball01x = ball01.getX();
ball01y = ball01.getY();
ball02x = ball02.getX();
ball02y = ball02.getY();
}
public void createBalls(){
ball01.create(300,300);
ball02.create(50,20);
}
public void updateBalls(){
ball01.Ball();
ball02.Ball();
}
}
Ball Class:
public class Ball{
private static int x;
private static int y;
private static int xSize = 30;
private static int ySize = 30;
static boolean xright = true,ydown = true;
static boolean grow = false;
public void Ball(){
this.moveBall();
this.ballSize();
}
public void create(int startX, int startY){
this.x = startX;
this.y = startY;
}
private void moveBall() {
if(this.x >= 370){
xright = false;
}
if(this.x <= 0){
xright = true;
}
if(this.y >= 370){
ydown = false;
}
if(this.y < 0){
ydown = true;
}
if(xright == true){
this.x = this.x + 1;
}else if (xright == false){
this.x = this.x - 1;
}
if(ydown == true){
this.y = this.y + 1;
}else if (ydown == false){
this.y = this.y - 1;
}
}
private void ballSize(){
if (xSize <= 5 && ySize <= 5){
grow = true;
}else if (xSize >= 10 && ySize >= 10){
grow = false;
}
if (grow == true){
xSize = xSize + 1;
ySize = ySize + 1;
//System.out.println("Debug");
}else if (grow == false){
xSize--;
ySize--;
//System.out.println("Debug");
}
}
public int getX(){
return x;
}
public int getY(){
return y;
}
}