提交小游戏项目

This commit is contained in:
2026-07-06 16:27:14 +08:00
commit 2a717c6a2f
7575 changed files with 710847 additions and 0 deletions
+8
View File
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b36e8ab4e5984c041a9918fddeed38f7
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
+254
View File
@@ -0,0 +1,254 @@
using System.Collections;
using System.Collections.Generic;
using Newtonsoft.Json;
using UnityEngine;
using DG.Tweening;
using TowerClimberChronicles;
public class level1 : MonoBehaviour
{
public GameObject plate_parent;
public GameObject item_parent;
private List<ItemState> _itemList;
public Camera cam;
private GameObject selected;
private Vector3 offset;
private int out_layers = 30;
private GameObject guo;
private List<Vector3> originalPositions = new List<Vector3>();
void Awake()
{
Camera orthoCamera = GameObject.Find("Main Camera").GetComponent<Camera>();
float size = (float)System.Math.Round(5.5f / ((float)Screen.width / Screen.height), 4);
// string type = SystemInfo.deviceModel.ToLower().Trim();
// // Debug.Log($"type==========={type}");
// if (type.Substring(0, 3) == "ipa")
// {//iPad机型
// size = 49.9f;
// }
Debug.Log(size + "////////////////");
orthoCamera.orthographicSize = size;
}
void Start()
{
guo = GameObject.Find("guo");
_itemList = new List<ItemState>();
foreach (Transform child in plate_parent.transform)
{
Debug.Log("子物体: " + child.name);
originalPositions.Add(child.position);
// 先把它们全部移到 (0,14)
child.position = new Vector3(0f, 14f, child.position.z);
}
originalPositions.Add(guo.transform.position);
guo.transform.position = new Vector3(0f, -15f, 0);
// 启动协程,逐个缓动回原位置
StartCoroutine(MoveBackCoroutine());
guo.transform.DOMove(originalPositions[originalPositions.Count - 1], 1f).SetEase(Ease.OutQuad);
foreach (Transform child in item_parent.transform)
{
Debug.Log("子物体: " + child.name);
Debug.Log("子物体: " + child.tag);
_itemList.Add(new ItemState()
{
_position = child.position,
_orderInLayer = child.GetComponent<SpriteRenderer>().sortingOrder,
_tag = child.tag,
_isFull = false
});
}
foreach (Transform child in item_parent.transform)
{
float randomX = Random.Range(-3f, 3f); // X 在 -2 ~ 2
float randomY = 14f + Random.Range(-2f, 2f); // Y 在 -16 ~ -12
child.position = new Vector3(randomX, randomY, child.position.z);
}
DOVirtual.DelayedCall(2.5f, () =>
{
StartCoroutine(MoveChildrenCoroutine());
});
Debug.Log(JsonConvert.SerializeObject(_itemList));
}
IEnumerator MoveChildrenCoroutine()
{
foreach (Transform child in item_parent.transform)
{
// 随机目标 Y 在 -5 ~ 5
float targetY = Random.Range(-5f, 5f);
Vector3 targetPos = new Vector3(child.position.x, targetY, child.position.z);
// DOTween 缓动到目标位置
child.DOMove(targetPos, 1.7f).SetEase(Ease.InCubic);
// 每个间隔 0.1s
yield return new WaitForSeconds(0.05f);
}
}
IEnumerator MoveBackCoroutine()
{
int index = 0;
foreach (Transform child in plate_parent.transform)
{
// 缓动到原始位置
child.DOMove(originalPositions[index], 0.5f).SetEase(Ease.OutQuad);
index++;
// 每隔 0.3s 执行一个
yield return new WaitForSeconds(0.2f);
}
}
private GameObject Popup;
void Update()
{
// 鼠标按下时检测
if (Input.GetMouseButtonDown(0))
{
if (Popup == null) Popup = GameObject.Find("Popup");
if (Popup != null && Popup.transform.childCount != 0) return;
Vector2 mousePos = cam.ScreenToWorldPoint(Input.mousePosition);
RaycastHit2D[] hits = Physics2D.RaycastAll(mousePos, Vector2.zero);
if (hits.Length > 0)
{
selected = GetTopSprite(hits);
if (selected != null)
{
// ✅ 如果该物体已经在 _itemList 中,释放槽位
foreach (var item in _itemList)
{
if (item._inGameobject == selected)
{
item._isFull = false;
item._inGameobject = null;
break;
}
}
selected.GetComponent<SpriteRenderer>().sortingLayerName = "layer_4_drag";
// 点击时强制修正为 0 度旋转
selected.transform.DORotate(Vector3.zero, 0.2f).SetEase(Ease.OutQuad);
// DOTween 缩放到固定 1.1 倍
selected.transform.DOScale(Vector3.one * 1.1f, 0.2f).SetEase(Ease.OutBack);
Vector3 pos = cam.ScreenToWorldPoint(Input.mousePosition);
offset = selected.transform.position - new Vector3(pos.x, pos.y, selected.transform.position.z);
selected.GetComponent<SpriteRenderer>().sortingOrder = out_layers;
out_layers++;
}
}
}
// 拖拽中
if (Input.GetMouseButton(0) && selected != null)
{
Vector3 pos = cam.ScreenToWorldPoint(Input.mousePosition);
selected.transform.position = new Vector3(pos.x, pos.y, selected.transform.position.z) + offset;
}
// 鼠标松开
if (Input.GetMouseButtonUp(0) && selected != null)
{
// DOTween 缩放还原到固定 1 倍
selected.transform.DOScale(Vector3.one, 0.2f).SetEase(Ease.InOutSine);
bool snapped = false;
// 吸附逻辑:检查标签和位置
string tag = selected.tag;
foreach (var item in _itemList)
{
if (item._isFull) continue;
if (item._tag == tag)
{
float dist = Vector3.Distance(selected.transform.position, item._position);
if (dist < 1f)
{
// 吸附过去并旋转归零
selected.transform.DOMove(item._position, 0.2f).SetEase(Ease.OutQuad);
selected.transform.DORotate(Vector3.zero, 0.2f).SetEase(Ease.OutQuad);
selected.GetComponent<SpriteRenderer>().sortingLayerName = "layer_2_inslot";
selected.GetComponent<SpriteRenderer>().sortingOrder = item._orderInLayer;
item._isFull = true;
item._inGameobject = selected;
snapped = true;
break;
}
}
}
// 如果吸附成功 → 检查整个列表
if (snapped)
{
bool allFull = true;
foreach (var item in _itemList)
{
if (!item._isFull)
{
allFull = false;
break;
}
}
if (allFull)
{
Debug.Log("所有物体都已吸附完成!");
GameDispatcher.Instance.Dispatch(GameMsg.GameSuccess);
}
}
else
{
// 如果没有吸附成功 → 随机旋转 ±8°
selected.GetComponent<SpriteRenderer>().sortingLayerName = "layer_3_out";
int randomChoice = Random.Range(0, 2); // 0 或 1
float randomAngle = (randomChoice == 0) ? -8f : 8f;
selected.transform.DORotate(new Vector3(0, 0, randomAngle), 0.3f).SetEase(Ease.OutQuad);
// GameDispatcher.Instance.Dispatch(GameMsg.GameSuccess);//zhushi
}
selected = null;
}
}
private GameObject GetTopSprite(RaycastHit2D[] hits)
{
GameObject top = null;
int topLayer = int.MinValue;
int topOrder = int.MinValue;
foreach (var hit in hits)
{
SpriteRenderer sr = hit.collider.GetComponent<SpriteRenderer>();
if (sr != null)
{
int layerID = SortingLayer.GetLayerValueFromID(sr.sortingLayerID);
int order = sr.sortingOrder;
if (layerID > topLayer || (layerID == topLayer && order > topOrder))
{
top = sr.gameObject;
topLayer = layerID;
topOrder = order;
}
}
}
return top;
}
}
public class ItemState
{
[JsonIgnore]
public Vector2 _position;
public int _orderInLayer;
public string _tag;
public bool _isFull;
public GameObject _inGameobject;
}
+11
View File
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: eb842c17c005e9e42b7b73a9eb4d12f3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+8
View File
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 44937624a42e12c4395b12789b4233a4
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
+325
View File
@@ -0,0 +1,325 @@
using System.Collections;
using System.Collections.Generic;
using Newtonsoft.Json;
using UnityEngine;
using DG.Tweening;
using TowerClimberChronicles;
public class level2 : MonoBehaviour
{
public GameObject item_parent;
public GameObject item_parent_big;
private List<ItemState_2> _itemList;
public Camera cam;
private GameObject selected;
private Vector3 offset;
private int out_layers = 30;
public GameObject empty_parent;
private List<Vector3> originalPositions = new List<Vector3>();
void Awake()
{
Camera orthoCamera = GameObject.Find("Main Camera").GetComponent<Camera>();
float size = (float)System.Math.Round(5.5f / ((float)Screen.width / Screen.height), 4);
// string type = SystemInfo.deviceModel.ToLower().Trim();
// // Debug.Log($"type==========={type}");
// if (type.Substring(0, 3) == "ipa")
// {//iPad机型
// size = 49.9f;
// }
orthoCamera.orthographicSize = size;
}
void Start()
{
_itemList = new List<ItemState_2>();
int index_ = 0;
foreach (Transform child in item_parent.transform)
{
// Debug.Log("子物体: " + child.name);
// Debug.Log("子物体: " + child.tag);
_itemList.Add(new ItemState_2()
{
_position = positionList[index_],
_orderInLayer = child.GetComponent<SpriteRenderer>().sortingOrder,
_tag = child.tag,
_isFull = false,
type = 1,
});
index_++;
}
foreach (Transform child in empty_parent.transform)
{
// Debug.Log("子物体: " + child.name);
// Debug.Log("子物体: " + child.tag);
_itemList.Add(new ItemState_2()
{
_position = positionList[index_],
_orderInLayer = child.GetComponent<SpriteRenderer>().sortingOrder,
_tag = child.tag,
_isFull = false,
type = 2
});
index_++;
}
// foreach (Transform child in item_parent.transform)
// {
// float randomX = Random.Range(-3f, 3f); // X 在 -2 ~ 2
// float randomY = 14f + Random.Range(-2f, 2f); // Y 在 -16 ~ -12
// child.position = new Vector3(randomX, randomY, child.position.z);
// }
// DOVirtual.DelayedCall(2.5f, () =>
// {
// StartCoroutine(MoveChildrenCoroutine());
// });
// Debug.Log(JsonConvert.SerializeObject(_itemList));
// foreach (var pos in positionList)
// {
// Debug.Log("Position: " + pos);
// }
}
List<Vector3> positionList = new List<Vector3>()
{
new Vector3(0.44f, 1.30f, 0.00f),
new Vector3(1.34f, -1.84f, 0.00f),
new Vector3(-0.46f, -1.38f, 0.00f),
new Vector3(-1.36f, 0.39f, 0.00f),
new Vector3(1.17f, 2.46f, 0.00f),
new Vector3(5.10f, 1.39f, 0.00f),
new Vector3(1.06f, 1.38f, 0.00f),
new Vector3(-1.48f, -1.30f, 0.00f),
new Vector3(-6.83f, -0.40f, 0.00f),
new Vector3(-2.82f, -0.40f, 0.00f),
new Vector3(2.80f, 2.46f, 0.00f),
new Vector3(-1.90f, -0.40f, 0.00f),
new Vector3(-1.39f, -2.17f, 0.00f),
new Vector3(0.83f, -0.41f, 0.00f),
new Vector3(-5.81f, 0.49f, 0.00f),
new Vector3(-6.61f, -1.29f, 0.00f),
new Vector3(-0.31f, 0.49f, 0.00f),
new Vector3(6.27f, -2.18f, 0.00f),
new Vector3(-2.58f, 1.39f, 0.00f)
};
// IEnumerator MoveChildrenCoroutine()
// {
// foreach (Transform child in item_parent.transform)
// {
// // 随机目标 Y 在 -5 ~ 5
// float targetY = Random.Range(-5f, 5f);
// Vector3 targetPos = new Vector3(child.position.x, targetY, child.position.z);
// // DOTween 缓动到目标位置
// child.DOMove(targetPos, 1.7f).SetEase(Ease.InCubic);
// // 每个间隔 0.1s
// yield return new WaitForSeconds(0.05f);
// }
// }
// IEnumerator MoveBackCoroutine()
// {
// int index = 0;
// foreach (Transform child in plate_parent.transform)
// {
// // 缓动到原始位置
// child.DOMove(originalPositions[index], 0.5f).SetEase(Ease.OutQuad);
// index++;
// // 每隔 0.3s 执行一个
// yield return new WaitForSeconds(0.2f);
// }
// }
private GameObject Popup;
void Update()
{
// 鼠标按下时检测
if (Input.GetMouseButtonDown(0))
{
if (Popup == null) Popup = GameObject.Find("Popup");
if (Popup != null && Popup.transform.childCount != 0) return;
Vector2 mousePos = cam.ScreenToWorldPoint(Input.mousePosition);
RaycastHit2D[] hits = Physics2D.RaycastAll(mousePos, Vector2.zero);
if (hits.Length > 0)
{
selected = GetTopSprite(hits);
if (selected != null)
{
if (selected.tag == "bg")
{
// bg 不做缩放和旋转,只记录偏移
Vector3 pos = cam.ScreenToWorldPoint(Input.mousePosition);
offset = selected.transform.position - new Vector3(pos.x, selected.transform.position.y, selected.transform.position.z);
}
else
{
// ✅ 如果该物体已经在 _itemList 中,释放槽位
foreach (var item in _itemList)
{
if (item._inGameobject == selected)
{
item._isFull = false;
item._inGameobject = null;
break;
}
}
selected.GetComponent<SpriteRenderer>().sortingLayerName = "layer_4_drag";
// 点击时强制修正为 0 度旋转
selected.transform.DORotate(Vector3.zero, 0.2f).SetEase(Ease.OutQuad);
// DOTween 缩放到固定 1.1 倍
selected.transform.DOScale(Vector3.one * 1.1f, 0.2f).SetEase(Ease.OutBack);
Vector3 pos = cam.ScreenToWorldPoint(Input.mousePosition);
offset = selected.transform.position - new Vector3(pos.x, pos.y, selected.transform.position.z);
selected.GetComponent<SpriteRenderer>().sortingOrder = out_layers;
out_layers++;
}
}
}
}
// 拖拽中
if (Input.GetMouseButton(0) && selected != null)
{
Vector3 pos = cam.ScreenToWorldPoint(Input.mousePosition);
if (selected.tag == "bg")
{
// 只允许 X 方向拖拽,限制在 [-2.3, 2.3]
float newX = pos.x + offset.x;
newX = Mathf.Clamp(newX, -2.8f, 2.8f);
selected.transform.position = new Vector3(newX, selected.transform.position.y, selected.transform.position.z);
}
else
{
selected.transform.position = new Vector3(pos.x, pos.y, selected.transform.position.z) + offset;
}
}
// 鼠标松开
if (Input.GetMouseButtonUp(0) && selected != null)
{
if (selected.tag != "bg")
{
// DOTween 缩放还原到固定 1 倍
selected.transform.DOScale(Vector3.one, 0.2f).SetEase(Ease.InOutSine);
bool snapped = false;
// 吸附逻辑:检查标签和位置
string tag = selected.tag;
foreach (var item in _itemList)
{
if (item._isFull) continue;
if (item._tag == tag)
{
float dist = 0;
if (item.type == 1)
{
dist = Vector3.Distance(selected.transform.localPosition, item._position);
}
else
{
Vector3 localPosInTarget = item_parent_big.transform.InverseTransformPoint(selected.transform.position);
dist = Vector3.Distance(localPosInTarget, item._position);
}
if (dist < 0.5f)
{
// selected.SetParent(item_parent_big);
if (item.type == 2) selected.transform.SetParent(item_parent_big.transform, true);
// 吸附过去并旋转归零
selected.transform.DOLocalMove(item._position, 0.2f).SetEase(Ease.OutQuad);
selected.transform.DORotate(Vector3.zero, 0.2f).SetEase(Ease.OutQuad);
selected.GetComponent<SpriteRenderer>().sortingLayerName = "layer_2_inslot";
selected.GetComponent<SpriteRenderer>().sortingOrder = item._orderInLayer;
item._isFull = true;
item._inGameobject = selected;
snapped = true;
selected.GetComponent<PolygonCollider2D>().enabled = false;
break;
}
}
}
// 如果吸附成功 → 检查整个列表
if (snapped)
{
bool allFull = true;
foreach (var item in _itemList)
{
if (!item._isFull)
{
allFull = false;
break;
}
}
if (allFull)
{
Debug.Log("所有物体都已吸附完成!");
GameDispatcher.Instance.Dispatch(GameMsg.GameSuccess);
}
}
else
{
// 如果没有吸附成功 → 随机旋转 ±8°
selected.GetComponent<SpriteRenderer>().sortingLayerName = "layer_3_out";
int randomChoice = Random.Range(0, 2); // 0 或 1
float randomAngle = (randomChoice == 0) ? -8f : 8f;
selected.transform.DORotate(new Vector3(0, 0, randomAngle), 0.3f).SetEase(Ease.OutQuad);
}
}
selected = null;
}
}
private GameObject GetTopSprite(RaycastHit2D[] hits)
{
GameObject top = null;
int topLayer = int.MinValue;
int topOrder = int.MinValue;
foreach (var hit in hits)
{
SpriteRenderer sr = hit.collider.GetComponent<SpriteRenderer>();
if (sr != null)
{
int layerID = SortingLayer.GetLayerValueFromID(sr.sortingLayerID);
int order = sr.sortingOrder;
if (layerID > topLayer || (layerID == topLayer && order > topOrder))
{
top = sr.gameObject;
topLayer = layerID;
topOrder = order;
}
}
}
return top;
}
}
public class ItemState_2
{
[JsonIgnore]
public Vector2 _position;
public int _orderInLayer;
public string _tag;
public bool _isFull;
public GameObject _inGameobject;
public int type;
}
+11
View File
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c1711a5743f98a4498b91f7d8357e33b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+8
View File
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 189c50593805e66479a52dbda84febed
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
+214
View File
@@ -0,0 +1,214 @@
using System.Collections;
using System.Collections.Generic;
using Newtonsoft.Json;
using UnityEngine;
using DG.Tweening;
using TowerClimberChronicles;
public class level3 : MonoBehaviour
{
public GameObject plate_parent;
public GameObject item_parent;
private List<ItemState> _itemList;
public Camera cam;
private GameObject selected;
private Vector3 offset;
private int out_layers = 30;
private List<Vector3> originalPositions = new List<Vector3>();
void Awake()
{
Camera orthoCamera = GameObject.Find("Main Camera").GetComponent<Camera>();
float size = (float)System.Math.Round(5.5f / ((float)Screen.width / Screen.height), 4);
// string type = SystemInfo.deviceModel.ToLower().Trim();
// // Debug.Log($"type==========={type}");
// if (type.Substring(0, 3) == "ipa")
// {//iPad机型
// size = 49.9f;
// }
Debug.Log(size + "////////////////");
orthoCamera.orthographicSize = size;
}
void Start()
{
_itemList = new List<ItemState>();
foreach (Transform child in item_parent.transform)
{
Debug.Log("子物体: " + child.name);
Debug.Log("子物体: " + child.tag);
_itemList.Add(new ItemState()
{
_position = child.position,
_orderInLayer = child.GetComponent<SpriteRenderer>().sortingOrder,
_tag = child.tag,
_isFull = false
});
}
foreach (Transform child in item_parent.transform)
{
Rigidbody2D rb = child.GetComponent<Rigidbody2D>();
if (rb != null)
{
rb.simulated = true;
// 随机方向
Vector2 randomDir = Random.insideUnitCircle.normalized;
// 随机力度(比如 5~10
float randomForce = Random.Range(2f,3f);
// 添加力
rb.AddForce(randomDir * randomForce, ForceMode2D.Impulse);
}
}
Debug.Log(JsonConvert.SerializeObject(_itemList));
}
private GameObject Popup;
void Update()
{
// 鼠标按下时检测
if (Input.GetMouseButtonDown(0))
{
if (Popup == null) Popup = GameObject.Find("Popup");
if (Popup != null && Popup.transform.childCount != 0) return;
Vector2 mousePos = cam.ScreenToWorldPoint(Input.mousePosition);
RaycastHit2D[] hits = Physics2D.RaycastAll(mousePos, Vector2.zero);
if (hits.Length > 0)
{
selected = GetTopSprite(hits);
if (selected != null)
{
// ✅ 如果该物体已经在 _itemList 中,释放槽位
foreach (var item in _itemList)
{
if (item._inGameobject == selected)
{
item._isFull = false;
item._inGameobject = null;
break;
}
}
selected.GetComponent<SpriteRenderer>().sortingLayerName = "layer_4_drag";
selected.GetComponent<Rigidbody2D>().simulated = false;
// 点击时强制修正为 0 度旋转
selected.transform.DORotate(Vector3.zero, 0.2f).SetEase(Ease.OutQuad);
// DOTween 缩放到固定 1.1 倍
// selected.transform.DOScale(Vector3.one * 1.1f, 0.2f).SetEase(Ease.OutBack);
Vector3 pos = cam.ScreenToWorldPoint(Input.mousePosition);
offset = selected.transform.position - new Vector3(pos.x, pos.y, selected.transform.position.z);
selected.GetComponent<SpriteRenderer>().sortingOrder = out_layers;
out_layers++;
}
}
}
// 拖拽中
if (Input.GetMouseButton(0) && selected != null)
{
Vector3 pos = cam.ScreenToWorldPoint(Input.mousePosition);
selected.transform.position = new Vector3(pos.x, pos.y, selected.transform.position.z) + offset;
}
// 鼠标松开
if (Input.GetMouseButtonUp(0) && selected != null)
{
// DOTween 缩放还原到固定 1 倍
selected.transform.DOScale(Vector3.one, 0.2f).SetEase(Ease.InOutSine);
bool snapped = false;
// 吸附逻辑:检查标签和位置
string tag = selected.tag;
foreach (var item in _itemList)
{
if (item._isFull) continue;
if (item._tag == tag)
{
float dist = Vector3.Distance(selected.transform.position, item._position);
if (dist < 0.5f)
{
// 吸附过去并旋转归零
selected.transform.DOMove(item._position, 0.2f).SetEase(Ease.OutQuad);
selected.transform.DORotate(Vector3.zero, 0.2f).SetEase(Ease.OutQuad);
selected.GetComponent<SpriteRenderer>().sortingLayerName = "layer_2_inslot";
selected.GetComponent<SpriteRenderer>().sortingOrder = item._orderInLayer;
item._isFull = true;
item._inGameobject = selected;
snapped = true;
selected.GetComponent<PolygonCollider2D>().enabled = false;
break;
}
}
}
// 如果吸附成功 → 检查整个列表
if (snapped)
{
bool allFull = true;
foreach (var item in _itemList)
{
if (!item._isFull)
{
allFull = false;
break;
}
}
if (allFull)
{
Debug.Log("所有物体都已吸附完成!");
GameDispatcher.Instance.Dispatch(GameMsg.GameSuccess);
}
}
else
{
// 如果没有吸附成功 → 随机旋转 ±8°
selected.GetComponent<SpriteRenderer>().sortingLayerName = "layer_3_out";
selected.GetComponent<Rigidbody2D>().simulated = true;
// int randomChoice = Random.Range(0, 2); // 0 或 1
// float randomAngle = (randomChoice == 0) ? -8f : 8f;
// selected.transform.DORotate(new Vector3(0, 0, randomAngle), 0.3f).SetEase(Ease.OutQuad);
// GameDispatcher.Instance.Dispatch(GameMsg.GameSuccess);//zhushi
}
selected = null;
}
}
private GameObject GetTopSprite(RaycastHit2D[] hits)
{
GameObject top = null;
int topLayer = int.MinValue;
int topOrder = int.MinValue;
foreach (var hit in hits)
{
SpriteRenderer sr = hit.collider.GetComponent<SpriteRenderer>();
if (sr != null)
{
int layerID = SortingLayer.GetLayerValueFromID(sr.sortingLayerID);
int order = sr.sortingOrder;
if (layerID > topLayer || (layerID == topLayer && order > topOrder))
{
top = sr.gameObject;
topLayer = layerID;
topOrder = order;
}
}
}
return top;
}
}
+11
View File
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1bc32a0fe02add54f91838ab980bb751
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+8
View File
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: d0af2e8e17d7b814493090d8113952d6
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
+520
View File
@@ -0,0 +1,520 @@
using System.Collections;
using System.Collections.Generic;
using Newtonsoft.Json;
using UnityEngine;
using DG.Tweening;
using TowerClimberChronicles;
using Unity.VisualScripting;
using UnityEngine.UI;
public class level4 : MonoBehaviour
{
public GameObject feiliao;
public GameObject zhongzi;
public GameObject feiliaodai;
public GameObject zhongzidai;
public Text progress_text;
public Image progress_;
public Image end_point;
public GameObject sunlight;
public Camera cam;
private GameObject selected;
private Vector3 offset;
private int out_layers = 30;
public GameObject water_;
private float now_sunlight;
private float max_sunlight = 300;
public List<ItemState_4> _itemlist = new List<ItemState_4>();
public List<GameObject> sunlight_list = new List<GameObject>();
void Awake()
{
Camera orthoCamera = GameObject.Find("Main Camera").GetComponent<Camera>();
float size = (float)System.Math.Round(5.5f / ((float)Screen.width / Screen.height), 4);
// string type = SystemInfo.deviceModel.ToLower().Trim();
// // Debug.Log($"type==========={type}");
// if (type.Substring(0, 3) == "ipa")
// {//iPad机型
// size = 49.9f;
// }
Debug.Log(size + "////////////////");
orthoCamera.orthographicSize = size;
}
void Start()
{
for (int i = 0; i < 5; i++)
{
ItemState_4 _item = new ItemState_4()
{
_gameobject = GameObject.Find("item_" + i),
};
_itemlist.Add(_item);
}
_itemlist[0].plant_state = 1;
progress_text.text = now_sunlight + "/" + max_sunlight;
progress_.rectTransform.sizeDelta = new Vector2(0, 20);
}
private int stage_ = 0;
private float spawnTimer = 0f;
private float spawnInterval = 0.1f;
private GameObject Popup;
void Update()
{
// 鼠标按下时检测
if (Input.GetMouseButtonDown(0))
{
if (Popup == null) Popup = GameObject.Find("Popup");
if (Popup != null && Popup.transform.childCount != 0) return;
Vector2 mousePos = cam.ScreenToWorldPoint(Input.mousePosition);
RaycastHit2D[] hits = Physics2D.RaycastAll(mousePos, Vector2.zero);
if (hits.Length > 0)
{
selected = GetTopSprite(hits);
if (selected != null)
{
if (selected.tag == "item_tag_0" || selected.tag == "item_tag_1")
{
selected.transform.DORotate(new Vector3(0, 0, 45), 0.2f).SetEase(Ease.OutQuad);
}
Vector3 pos = cam.ScreenToWorldPoint(Input.mousePosition);
offset = selected.transform.position - new Vector3(pos.x, pos.y, selected.transform.position.z);
selected.GetComponent<SpriteRenderer>().sortingOrder = 2;
//out_layers++;
}
}
}
if (Input.GetMouseButton(0) && selected != null)
{
Vector3 pos = cam.ScreenToWorldPoint(Input.mousePosition);
if (selected.tag == "bg")
{
float newX = pos.x + offset.x;
newX = Mathf.Clamp(newX, -5f, 5f);
selected.transform.position = new Vector3(
newX,
selected.transform.position.y,
selected.transform.position.z);
water_.SetActive(true);
if (stage_ == 0)
{
if ((selected.transform.position.x > -1) && (selected.transform.position.x < 1))
{
_itemlist[0].water_time += Time.deltaTime;
}
if (_itemlist[0].water_time >= 1 && _itemlist[0].plant_state < 5)
{
_itemlist[0]._gameobject.transform.GetChild(_itemlist[0].plant_state - 1).GetComponent<SpriteRenderer>().enabled = false;
_itemlist[0]._gameobject.transform.GetChild(_itemlist[0].plant_state).GetComponent<SpriteRenderer>().enabled = true;
_itemlist[0].plant_state++;
_itemlist[0].water_time = 0;
}
if (_itemlist[0].plant_state == 5 && !_itemlist[0].is_end)
{
_itemlist[0].is_end = true;
CrearSunlight(0);
Debug.Log("生产阳光");
}
}
if (stage_ == 1)
{
if ((selected.transform.position.x > -3) && (selected.transform.position.x < -1) && (_itemlist[1].plant_state > 0))
{
_itemlist[1].water_time += Time.deltaTime;
}
if ((selected.transform.position.x > 1) && (selected.transform.position.x < 3) && (_itemlist[2].plant_state > 0))
{
_itemlist[2].water_time += Time.deltaTime;
}
for (int i = 1; i < 3; i++)
{
if (_itemlist[i].water_time >= 1 && _itemlist[i].plant_state < 5)
{
if (!_itemlist[i].use_feiliao && _itemlist[i].plant_state == 4)
{
}
else
{
_itemlist[i]._gameobject.transform.GetChild(_itemlist[i].plant_state - 1).GetComponent<SpriteRenderer>().enabled = false;
_itemlist[i]._gameobject.transform.GetChild(_itemlist[i].plant_state).GetComponent<SpriteRenderer>().enabled = true;
_itemlist[i].plant_state++;
_itemlist[i].water_time = 0;
}
}
if (_itemlist[i].plant_state == 5 && !_itemlist[i].is_end)
{
_itemlist[i].is_end = true;
// _itemlist[i]._gameobject.SetActive(false);
// Debug.Log("生产阳光");
CrearSunlight(i);
}
}
}
if (stage_ == 2)
{
if ((selected.transform.position.x > -3) && (selected.transform.position.x < -1) && (_itemlist[3].plant_state > 0))
{
_itemlist[3].water_time += Time.deltaTime;
}
if ((selected.transform.position.x > 1) && (selected.transform.position.x < 3) && (_itemlist[4].plant_state > 0))
{
_itemlist[4].water_time += Time.deltaTime;
}
for (int i = 3; i < 5; i++)
{
if (_itemlist[i].water_time >= 1 && _itemlist[i].plant_state < 5)
{
if (!_itemlist[i].use_feiliao && _itemlist[i].plant_state == 4)
{
}
else
{
_itemlist[i]._gameobject.transform.GetChild(_itemlist[i].plant_state - 1).GetComponent<SpriteRenderer>().enabled = false;
_itemlist[i]._gameobject.transform.GetChild(_itemlist[i].plant_state).GetComponent<SpriteRenderer>().enabled = true;
_itemlist[i].plant_state++;
_itemlist[i].water_time = 0;
}
}
if (_itemlist[i].plant_state == 5 && !_itemlist[i].is_end)
{
_itemlist[i].is_end = true;
// _itemlist[i]._gameobject.SetActive(false);
// // stage_ = 1;
// Debug.Log("生产阳光");
CrearSunlight(i);
}
}
}
}
else
{
selected.transform.position = new Vector3(pos.x, pos.y, selected.transform.position.z) + offset;
// Y > 2 时开始定时生成
if (selected.transform.position.y > 0f)
{
spawnTimer += Time.deltaTime;
if (spawnTimer >= spawnInterval)
{
spawnTimer = 0f;
if (selected.tag == "item_tag_0") SpawnDropObject(0);
else if (selected.tag == "item_tag_1") SpawnDropObject(1);
}
}
else
{
spawnTimer = 0f;
}
}
}
else
{
spawnTimer = 0f;
}
if (Input.GetMouseButton(0))
{
if (Popup == null) Popup = GameObject.Find("Popup");
if (Popup != null && Popup.transform.childCount != 0) return;
Vector2 mousePos = cam.ScreenToWorldPoint(Input.mousePosition);
RaycastHit2D[] hits = Physics2D.RaycastAll(mousePos, Vector2.zero);
foreach (var hit in hits)
{
if (hit.collider.CompareTag("item_tag_3"))
{
Transform obj = hit.collider.transform;
// 1. UI 转屏幕坐标(传入你的 UI 所属的 Canvas 的相机)
Vector3 screenPos = RectTransformUtility.WorldToScreenPoint(cam, end_point.rectTransform.position);
// 2. 屏幕坐标转场景世界坐标,z 要给一个合适的深度
Vector3 targetPos = cam.ScreenToWorldPoint(new Vector3(screenPos.x, screenPos.y, cam.nearClipPlane + 5f));
// 3. DOTween Sequence:移动 + 缩放,同时执行
DG.Tweening.Sequence seq = DOTween.Sequence();
seq.Join(obj.DOMove(targetPos, 0.7f).SetEase(Ease.OutCubic));
seq.Join(obj.DOScale(Vector3.one * 0.2f, 0.7f).SetEase(Ease.OutCubic));
// 4. 动画完成后销毁物体
seq.OnComplete(() =>
{
sunlight_list.Remove(obj.gameObject);
now_sunlight += 10;
progress_text.text = now_sunlight + "/" + max_sunlight;
progress_.rectTransform.sizeDelta = new Vector2((now_sunlight / max_sunlight) * 100, 20);
Destroy(obj.gameObject);
if (sunlight_list.Count <= 0)
{
if (stage_ == 0)
{
// _itemlist[0]._gameobject.SetActive(false);
SpriteRenderer sr = _itemlist[0]._gameobject.transform.GetChild(4).GetComponent<SpriteRenderer>();
sr.DOFade(0f, 1f); // 1秒内透明度变为0
stage_ = 1;
}
else if (stage_ == 1)
{
if (_itemlist[1].is_end && _itemlist[2].is_end)
{
// _itemlist[1]._gameobject.SetActive(false);
// _itemlist[2]._gameobject.SetActive(false);
SpriteRenderer sr = _itemlist[1]._gameobject.transform.GetChild(4).GetComponent<SpriteRenderer>();
sr.DOFade(0f, 1f); // 1秒内透明度变为0
SpriteRenderer sr1 = _itemlist[2]._gameobject.transform.GetChild(4).GetComponent<SpriteRenderer>();
sr1.DOFade(0f, 1f); // 1秒内透明度变为0
stage_ = 2;
}
}
else if (stage_ == 2)
{
if (_itemlist[3].is_end && _itemlist[4].is_end)
{
Debug.Log("所有物体都已吸附完成!");
GameDispatcher.Instance.Dispatch(GameMsg.GameSuccess);
}
}
}
});
hit.collider.enabled = false;
}
}
}
// 鼠标松开
if (Input.GetMouseButtonUp(0) && selected != null)
{
if (selected.tag == "bg")
{
water_.SetActive(false);
selected.transform.DOMove(new Vector3(-5, -11.44f, 0), 0.4f).SetEase(Ease.Linear);
}
if (selected.tag == "item_tag_0")
{
selected.transform.DORotate(Vector3.zero, 0.2f).SetEase(Ease.OutQuad);
selected.transform.DOMove(new Vector3(2.64f, -4.73f, 0), 0.3f).SetEase(Ease.Linear);
selected.GetComponent<SpriteRenderer>().sortingOrder = 1;
}
if (selected.tag == "item_tag_1")
{
selected.transform.DORotate(Vector3.zero, 0.2f).SetEase(Ease.OutQuad);
selected.transform.DOMove(new Vector3(3.91f, -3.88f, 0), 0.3f).SetEase(Ease.Linear);
selected.GetComponent<SpriteRenderer>().sortingOrder = 0;
}
selected = null;
}
}
void SpawnDropObject(int type)
{
GameObject go = null;
if (type == 0)
{
go = Instantiate(
zhongzi,
new Vector3(selected.transform.position.x - 1f, selected.transform.position.y, 0),
Quaternion.identity);
}
else
{
go = Instantiate(
feiliao,
new Vector3(selected.transform.position.x - 1f, selected.transform.position.y, 0),
Quaternion.identity);
}
go.transform.DOMoveY(-1f, 8f)
.SetSpeedBased()
.SetEase(Ease.Linear)
.OnComplete(() =>
{
if (stage_ == 1 && type == 0)
{
if (_itemlist[1].plant_state == 0)
{
if (go.transform.position.x > -3 && go.transform.position.x < -1)
{
_itemlist[1].plant_state = 1;
_itemlist[1]._gameobject.transform.GetChild(0).GetComponent<SpriteRenderer>().enabled = true;
}
}
if (_itemlist[2].plant_state == 0)
{
if (go.transform.position.x > 1 && go.transform.position.x < 3)
{
_itemlist[2].plant_state = 1;
_itemlist[2]._gameobject.transform.GetChild(0).GetComponent<SpriteRenderer>().enabled = true;
}
}
}
if (stage_ == 2 && type == 0)
{
if (_itemlist[3].plant_state == 0)
{
if (go.transform.position.x > -3 && go.transform.position.x < -1)
{
_itemlist[3].plant_state = 1;
_itemlist[3]._gameobject.transform.GetChild(0).GetComponent<SpriteRenderer>().enabled = true;
}
}
if (_itemlist[4].plant_state == 0)
{
if (go.transform.position.x > 1 && go.transform.position.x < 3)
{
_itemlist[4].plant_state = 1;
_itemlist[4]._gameobject.transform.GetChild(0).GetComponent<SpriteRenderer>().enabled = true;
}
}
}
if (stage_ == 1 && type == 1)
{
if (go.transform.position.x > -3 && go.transform.position.x < -1)
{
CheckFeiliao(1);
}
if (go.transform.position.x > 1 && go.transform.position.x < 3)
{
CheckFeiliao(2);
}
}
if (stage_ == 2 && type == 1)
{
if (go.transform.position.x > -3 && go.transform.position.x < -1)
{
CheckFeiliao(3);
}
if (go.transform.position.x > 1 && go.transform.position.x < 3)
{
CheckFeiliao(4);
}
}
Destroy(go);
});
}
void CheckFeiliao(int index)
{
if (!_itemlist[index].use_feiliao)
{
_itemlist[index].use_feiliao = true;
if (_itemlist[index].water_time >= 1 && _itemlist[index].plant_state < 5)
{
if (!_itemlist[index].use_feiliao && _itemlist[index].plant_state == 4)
{
}
else
{
_itemlist[index]._gameobject.transform.GetChild(_itemlist[index].plant_state - 1).GetComponent<SpriteRenderer>().enabled = false;
_itemlist[index]._gameobject.transform.GetChild(_itemlist[index].plant_state).GetComponent<SpriteRenderer>().enabled = true;
_itemlist[index].plant_state++;
_itemlist[index].water_time = 0;
}
}
if (_itemlist[index].plant_state == 5 && !_itemlist[index].is_end)
{
_itemlist[index].is_end = true;
// _itemlist[index]._gameobject.SetActive(false);
// // stage_ = 1;
// Debug.Log("生产阳光");
CrearSunlight(index);
}
}
}
void CrearSunlight(int index)
{
for (int j = 0; j < 6; j++)
{
// 在指定位置生成
GameObject obj = Instantiate(sunlight, _itemlist[index]._gameobject.transform.position, Quaternion.identity);
// 获取刚体
Rigidbody2D rb = obj.GetComponent<Rigidbody2D>();
if (rb != null)
{
// 随机方向
Vector2 randomDir = Random.insideUnitCircle.normalized;
// 随机力度
float randomForce = Random.Range(2, 3);
// 添加力(瞬间冲量)
rb.AddForce(randomDir * randomForce, ForceMode2D.Impulse);
}
sunlight_list.Add(obj);
}
}
private GameObject GetTopSprite(RaycastHit2D[] hits)
{
GameObject top = null;
int topLayer = int.MinValue;
int topOrder = int.MinValue;
foreach (var hit in hits)
{
SpriteRenderer sr = hit.collider.GetComponent<SpriteRenderer>();
if (sr != null)
{
int layerID = SortingLayer.GetLayerValueFromID(sr.sortingLayerID);
int order = sr.sortingOrder;
if (layerID > topLayer || (layerID == topLayer && order > topOrder))
{
top = sr.gameObject;
topLayer = layerID;
topOrder = order;
}
}
}
return top;
}
}
public class ItemState_4
{
public float water_time = 0f;
public int plant_state = 0;
public bool use_feiliao = false;
public GameObject _gameobject;
public bool is_end;
}
+11
View File
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ec7dafbe92c87dd4293025c35249ce3a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: