CutePet/Assets/Scripts/CreateLev/CreateLevMain.cs
2024-10-25 11:10:04 +08:00

246 lines
7.3 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections;
using System.Collections.Generic;
using LitJson;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
public class CreateLevMain : MonoBehaviour
{
public Transform gamePos;
// 存放萌宠的预制体
public GameObject[] petPrefabs;
// 存放萌宠的按钮
public Button[] petBtns;
// 当前选择的萌宠预制体
private GameObject nowChoosePet;
// 当前点击生成的萌宠实例
private GameObject createPetGameObj;
//上传关卡按钮
public Button btnUpload;
// 第一个输入框,只输入数字
public InputField inputNum;
public Text txtLev;
public TipPanel tipPanel;
// 设定输入框输入的最大值
private int maxValue = 99999;
//宠物信息
private PetInfo pet;
private LevData levData;
private float x;
private float y;
private string levDataUploadUrl= "http://192.168.2.24:8080/uploadLevData"; // 服务器的URL
// Start is called before the first frame update
void Start()
{
tipPanel.gameObject.SetActive(false);
// 绑定每个按钮的点击事件
for (int i = 0; i < petBtns.Length; i++)
{
int index = i; // 缓存索引
petBtns[i].GetComponent<Button>().onClick.AddListener(() => OnPetButtonClicked(index));
}
btnUpload.onClick.AddListener(() =>
{
if (txtLev.text!="")
{
OnButtonClick();
}
});
// 监听第一个输入框的内容变化
inputNum.onValueChanged.AddListener(OnNumberInputChanged);
}
// Update is called once per frame
void Update()
{
// 确保选中了萌宠预制体
if (nowChoosePet != null)
{
// 检测鼠标左键是否点击
if (Input.GetMouseButtonDown(0))
{
// 将屏幕坐标转换为世界坐标
Vector3 mousePosition = Input.mousePosition;
mousePosition.z = Camera.main.nearClipPlane; // 设置深度为相机的近裁剪面
Vector3 worldPosition = Camera.main.ScreenToWorldPoint(mousePosition);
// 生成萌宠
if (createPetGameObj == null)
{
createPetGameObj = Instantiate(nowChoosePet, worldPosition, Quaternion.identity);
createPetGameObj.name = nowChoosePet.name;
createPetGameObj.AddComponent<PetDelet>();
createPetGameObj.transform.SetParent(gamePos, false);
nowChoosePet = null;
}
else
{
createPetGameObj = Instantiate(nowChoosePet, worldPosition, Quaternion.identity);
createPetGameObj.name = nowChoosePet.name;
createPetGameObj.AddComponent<PetDelet>();
createPetGameObj.transform.SetParent(gamePos,false);
nowChoosePet = null;
}
}
}
}
// 当萌宠按钮被点击时
void OnPetButtonClicked(int index)
{
// 选择对应的萌宠预制体
nowChoosePet = petPrefabs[index];
Debug.Log("Selected Pet: " + nowChoosePet.name);
}
// 当第一个InputField内容改变时调用
void OnNumberInputChanged(string str)
{
if (int.TryParse(str, out int number))
{
// 如果输入的数字大于最大值,强制设置为最大值
if (number > maxValue)
{
number= maxValue;
inputNum.text = maxValue.ToString();
}
// 转换为中文大写数字
string chineseNumber = ConvertToChineseNumber(number);
// 更新第二个输入框的内容
txtLev.text = $"第{chineseNumber}关";
}
else
{
txtLev.text = "请输入有效的数字"; // 防止空输入或无效输入
}
}
// 将数字转换为中文大写
string ConvertToChineseNumber(int number)
{
string[] chineseDigits = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
string[] chineseUnits = { "", "十", "百", "千", "万" ,"十万"};
string result = "";
int unitIndex = 0;
if (number == 0) return chineseDigits[0]; // 如果是0直接返回“零”
while (number > 0)
{
int digit = number % 10; // 取最后一位数字
if (digit > 0 || unitIndex == 0) // 避免中文大写中的“零百”,“零十”
{
result = chineseDigits[digit] + chineseUnits[unitIndex] + result;
}
else if (digit == 0 && result.Length > 0 && result[0] != '零') // 处理零
{
result = "零" + result;
}
number /= 10; // 去掉最后一位数字
unitIndex++;
}
// 特殊处理十的情况,比如"十二"而不是"一十二"
if (result.StartsWith("一十"))
{
result = result.Substring(1);
}
// 移除结果末尾的多余“零”
if (result.EndsWith("零"))
{
result = result.TrimEnd('零');
}
return result;
}
// 当按钮点击时调用此函数
public void OnButtonClick()
{
// 获取所有标签为 "PetObject" 的游戏对象
GameObject[] petObjects = GameObject.FindGameObjectsWithTag("PetObject");
levData = new LevData();
levData.petInfoList = new List<PetInfo>();
levData.id = int.Parse(inputNum.text);
levData.name = txtLev.text;
// 遍历所有找到的宠物对象
foreach (GameObject petObject in petObjects)
{
// 获取对象的x和y位置
x = petObject.transform.position.x;
y = petObject.transform.position.y;
// 获取对象的资源地址(这里假设资源名是其预制体名)
string petName = GetResourcePath(petObject);
// 创建PetData对象并添加到列表中
pet = new PetInfo();
pet.post_x = x;
pet.post_y = y;
pet.res = petName;
levData.petInfoList.Add(pet);
}
// 将数据发送到服务器
StartCoroutine(SendDataToServer(levData));
}
// 发送数据到服务器
private IEnumerator SendDataToServer(LevData levData)
{
// 将宠物对象数据序列化为JSON
string jsonData = LitJson.JsonMapper.ToJson(levData);
// 创建POST请求
using (UnityWebRequest req = new UnityWebRequest(levDataUploadUrl, "POST"))
{
byte[] bodyRaw = new System.Text.UTF8Encoding().GetBytes(jsonData);
req.uploadHandler = new UploadHandlerRaw(bodyRaw);
req.downloadHandler = new DownloadHandlerBuffer();
req.SetRequestHeader("Content-Type", "application/json");
// 发送请求并等待响应
yield return req.SendWebRequest();
// 检查响应结果
if (req.result == UnityWebRequest.Result.Success)
{
string str = req.downloadHandler.text;
IsSuccessMsg msg = JsonMapper.ToObject<IsSuccessMsg>(str);
tipPanel.gameObject.SetActive(true);
//更新面板
tipPanel.UpdatePanel(msg);
}
else
{
Debug.LogError("发送数据失败: " + req.error);
}
}
}
// 获取对象的资源地址
private string GetResourcePath(GameObject petObject)
{
// 你可以根据项目实际情况自定义如何获取资源地址
// 这里使用对象的名字作为资源地址
return "GameObject/"+petObject.name; // 预制体的名字
}
}