[TASK] Show collected duck stickers
This commit is contained in:
@@ -1,16 +1,17 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Mapbox.CheapRulerCs;
|
||||
using Mapbox.Unity.Map;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Serialization;
|
||||
|
||||
public class CollectableDuckManager : MonoBehaviour
|
||||
{
|
||||
[FormerlySerializedAs("CollectableDucks")] public List<CollectableDuckData> collectableDucks;
|
||||
public List<CollectableDuckData> collectableDucks;
|
||||
|
||||
Dictionary<CollectableDuckData, CollectableDuck> spawnedDucks = new Dictionary<CollectableDuckData, CollectableDuck>();
|
||||
private readonly HashSet<CollectableDuckData> _collectedDucks = new HashSet<CollectableDuckData>();
|
||||
|
||||
private readonly Dictionary<CollectableDuckData, CollectableDuck> _spawnedDucks = new Dictionary<CollectableDuckData, CollectableDuck>();
|
||||
|
||||
public AbstractMap map;
|
||||
public Transform player;
|
||||
@@ -34,6 +35,15 @@ public class CollectableDuckManager : MonoBehaviour
|
||||
Instance = this;
|
||||
}
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
_collectedDucks.Clear();
|
||||
foreach (var duck in collectableDucks.Where(duck => PlayerPrefs.GetInt("duck." + duck.Id) > 0))
|
||||
{
|
||||
_collectedDucks.Add(duck);
|
||||
}
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
var ruler = new CheapRuler(map.CenterLatitudeLongitude.x, CheapRulerUnits.Meters);
|
||||
@@ -44,33 +54,58 @@ public class CollectableDuckManager : MonoBehaviour
|
||||
var duckCoord = duck.LatitudeLongitude;
|
||||
var dist = ruler.Distance(duckCoord.ToArray(), playerPosition);
|
||||
// Debug.Log("Distance to " + duck.name + ": " + dist);
|
||||
if (dist < spawnDistance)
|
||||
if (dist < spawnDistance && !_collectedDucks.Contains(duck))
|
||||
{
|
||||
if (!spawnedDucks.ContainsKey(duck))
|
||||
{
|
||||
// Spawn the duck
|
||||
var duckSpawn = Instantiate(duckSpawnPrefab, map.GeoToWorldPosition(duckCoord), Quaternion.identity,
|
||||
transform);
|
||||
var duckModel = Instantiate(duck.ModelPrefab, duckSpawn.transform);
|
||||
duckModel.transform.localPosition = Vector3.zero;
|
||||
|
||||
spawnedDucks[duck] = duckSpawn;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!spawnedDucks[duck].gameObject.activeSelf)
|
||||
{
|
||||
spawnedDucks[duck].gameObject.SetActive(true);
|
||||
}
|
||||
}
|
||||
|
||||
} else if (spawnedDucks.ContainsKey(duck))
|
||||
SpawnDuck(duck);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (spawnedDucks[duck].gameObject.activeSelf)
|
||||
{
|
||||
spawnedDucks[duck].gameObject.SetActive(false);
|
||||
}
|
||||
RemoveDuck(duck);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SpawnDuck(CollectableDuckData duck)
|
||||
{
|
||||
if (!_spawnedDucks.ContainsKey(duck))
|
||||
{
|
||||
// Spawn the duck
|
||||
var duckSpawn = Instantiate(duckSpawnPrefab, map.GeoToWorldPosition(duck.LatitudeLongitude),
|
||||
Quaternion.identity, transform);
|
||||
duckSpawn.CollectableDuckData = duck;
|
||||
var duckModel = Instantiate(duck.ModelPrefab, duckSpawn.transform);
|
||||
duckModel.transform.localPosition = Vector3.zero;
|
||||
|
||||
_spawnedDucks[duck] = duckSpawn;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!_spawnedDucks[duck].gameObject.activeSelf)
|
||||
{
|
||||
_spawnedDucks[duck].gameObject.SetActive(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void RemoveDuck(CollectableDuckData duck)
|
||||
{
|
||||
if (_spawnedDucks.ContainsKey(duck))
|
||||
{
|
||||
if (_spawnedDucks[duck].gameObject.activeSelf)
|
||||
{
|
||||
_spawnedDucks[duck].gameObject.SetActive(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void DuckCollected(CollectableDuckData duck)
|
||||
{
|
||||
_collectedDucks.Add(duck);
|
||||
PlayerPrefs.SetInt("duck." + duck.Id, 1);
|
||||
|
||||
DuckStickerManager.Instance.OnStickerCollected(duck.StickerData);
|
||||
|
||||
RemoveDuck(duck);
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user