246 lines
7.3 KiB
C#
246 lines
7.3 KiB
C#
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; // 预制体的名字
|
||
}
|
||
}
|