ããå¨æ¬ç¯æç¨ä¸ï¼æ们å°ä½¿ç¨ç®åçç©çæºå¶æ¨¡æä¸ä¸ªå¨æç2Dæ°´ä½ãæ们å°ä½¿ç¨ä¸ä¸ªçº¿æ§æ¸²æå¨ãç½æ ¼æ¸²æå¨ï¼è§¦åå¨ä»¥åç²åçæ··åä½æ¥åé è¿ä¸æ°´ä½ææï¼æç»å¾å°å¯è¿ç¨äºä½ ä¸æ¬¾æ¸¸æç水纹åæ°´è±ãè¿éå
å«äºUnityæ ·æ¬æºï¼ä½ä½ åºè¯¥è½å¤ä½¿ç¨ä»»ä½æ¸¸æå¼æ以ç¸åçåçæ§è¡ç±»ä¼¼çæä½ã
ãã设置水ä½ç®¡çå¨
ããæ们å°ä½¿ç¨Unityçä¸ä¸ªçº¿æ§æ¸²æå¨æ¥æ¸²ææ们çæ°´ä½è¡¨é¢ï¼å¹¶ä½¿ç¨è¿äºèç¹æ¥å±ç°æç»ç波纹ã
ããunity-water-linerenderer(from gamedevelopment)
ããæ们å°è¿½è¸ªæ¯ä¸ªèç¹çä½ç½®ãé度åå éæ
åµã为æ¤ï¼æ们å°ä¼ä½¿ç¨å°éµåãæ以å¨æ们ç类顶端å°æ·»å å¦ä¸åéï¼
ããfloat[] xpositions;
ããfloat[] ypositions;
ããfloat[] velocities;
ããfloat[] accelerations;
ããLineRenderer Body;
ããLineRendererå°åå¨æ们ææçèç¹ï¼å¹¶æ¦è¿°æ们çæ°´ä½ãæ们ä»éè¦æ°´ä½æ¬èº«ï¼å°ä½¿ç¨Meshesæ¥åé ãæ们å°éè¦å¯¹è±¡æ¥æ管è¿äºç½æ ¼ã
ããGameObject[] meshobjects;
ããMesh[] meshes;
ããæ们è¿éè¦ç¢°æå¨ä»¥ä¾¿äºç©å¯åæ°´ä½äºå¨ï¼
ããGameObject[] colliders;
ããæ们ä¹åå¨äºææç常éï¼
ããconst float springconstant = 0.02f;
ããconst float damping = 0.04f;
ããconst float spread = 0.05f;
ããconst float z = -1f;
ããè¿äºå¸¸éä¸çzæ¯æ们为水ä½è®¾ç½®çZä½ç§»ãæ们å°ä½¿ç¨-1æ 注å®ï¼è¿æ ·å®å°±ä¼åç°äºæ们ç对象ä¹åï¼æ¸¸æé¦æ³¨ï¼ä½ å¯è½æ³æ ¹æ®èªå·±çéæ±å°å
¶è°æ´ä¸ºå¨å¯¹è±¡ä¹åæä¹åï¼é£ä½ å°±å¿
须使ç¨Zåæ æ¥ç¡®å®ä¸ä¹ç¸å
³çç²¾çµæå¨çä½ç½®ï¼ã
ããä¸ä¸æ¥ï¼æ们å°ä¿æä¸äºå¼ï¼
ããfloat baseheight;
ããfloat left;
ããfloat bottom;
ããè¿äºå°±æ¯æ°´ç维度ã
ããæ们å°éè¦ä¸äºå¯ä»¥å¨ç¼è¾å¨ä¸è®¾ç½®çå
¬å¼åéãé¦å
ï¼æ们å°ä¸ºæ°´è±ä½¿ç¨ç²åç³»ç»ï¼
ããpublic GameObject splash:
ããæ¥ä¸æ¥å°±æ¯æ们å°ç¨äºçº¿æ§æ¸²æå¨çææï¼
ããpublic Material mat:
ããæ¤å¤ï¼æ们å°ä¸ºä¸»è¦æ°´ä½ä½¿ç¨çç½æ ¼ç±»åå¦ä¸ï¼
ããpublic GameObject watermesh:
ããæ们æ³è¦è½å¤æ管ææè¿äºæ°æ®ç游æ对象ï¼ä»¤å
¶ä½ä¸ºç®¡çå¨ï¼äº§åºæ们游æä¸çæ°´ä½ã为æ¤ï¼æ们å°ç¼åSpawnWater()å½æ°ã
ããè¿ä¸ªå½æ°å°éç¨æ°´ä½å·¦è¾¹ãè·é©¬åº¦ã顶ç¹ä»¥ååºé¨çè¾å
¥ï¼
ããpublic void SpawnWater(float Left, float Width, float Top, float Bottom)
ãã{
ããï¼è½ç¶è¿çä¼¼ææçç¾ï¼ä½å´æå©äºä»å·¦å¾å³å¿«éè¿è¡å
³å¡è®¾è®¡ï¼
ããåé èç¹
ããç°å¨æ们å°æ¾åºèªå·±éè¦å¤å°èç¹ï¼
ããint edgecount = Mathf.RoundToInt(Width) * 5;
ããint nodecount = edgecount + 1;
ããæ们å°é对æ¯ä¸ªåä½å®½åº¦ä½¿ç¨5个èç¹ï¼ä»¥ä¾¿åç°æµç
ç移å¨ï¼ä½ å¯ä»¥æ¹åè¿ä¸ç¹ä»¥ä¾¿å¹³è¡¡æçä¸æµç
æ§ï¼ãæ们ç±æ¤å¯å¾å°ææ线段ï¼ç¶åéè¦å¨æ«ç«¯çèç¹ + 1ã
ããæ们è¦åçé¦ä»¶äºå°±æ¯ä»¥LineRendererç»ä»¶æ¸²ææ°´ä½ï¼
ããBody = gameObject.AddComponent<LineRenderer>();
ããBody.material = mat;
ããBody.material.renderQueue = 1000;
ããBody.SetVertexCount(nodecount);
ããBody.SetWidth(0.1f, 0.1f);
ããæ们å¨æ¤è¿è¦åçæ¯éæ©ææï¼å¹¶éè¿éæ©æ¸²æéåä¸çä½ç½®è令å
¶å¨æ°´é¢ä¹ä¸æ¸²æãæ们设置æ£ç¡®çèç¹æ°æ®ï¼å°çº¿æ®µå®½åº¦è®¾ä¸º0.1ã
ããä½ å¯ä»¥æ ¹æ®èªå·±æéç线段ç²ç»æ¥æ¹åè¿ä¸å®½åº¦ãä½ å¯è½æ³¨æå°äºSetWidth()éè¦ä¸¤ä¸ªåæ°ï¼è¿æ¯çº¿æ®µå¼å§åæ«å°¾ç宽度ãæ们å¸æ该宽度æå®ä¸åã
ããç°å¨æ们å¶ä½äºèç¹ï¼å°åå§åæ们ææç顶级åéï¼
ããxpositions = new float[nodecount];
ããypositions = new float[nodecount];
ããvelocities = new float[nodecount];
ããaccelerations = new float[nodecount];
ããmeshobjects = new GameObject[edgecount];
ããmeshes = new Mesh[edgecount];
ããcolliders = new GameObject[edgecount];
ããbaseheight = Top;
ããbottom = Bottom;
ããleft = Left;
ããæ们已ç»æäºææéµåï¼å°æ§å¶æ们çæ°æ®ã
ããç°å¨è¦è®¾ç½®æ们éµåçå¼ãæ们å°ä»èç¹å¼å§ï¼
ããfor (int i = 0; i < nodecount; i++)
ãã{
ããypositions[i] = Top;
ããxpositions[i] = Left + Width * i / edgecount;
ããaccelerations[i] = 0;
ããvelocities[i] = 0;
ããBody.SetPosition(i, new Vector3(xpositions[i], ypositions[i], z));
ãã}
ããå¨æ¤ï¼æ们å°ææYä½ç½®è®¾äºæ°´ä½ä¹ä¸ï¼ä¹åä¸èµ·æ¸è¿å¢å ææèç¹ãå 为水é¢å¹³éï¼æ们çé度åå éå¼æå为0ã
ããæ们å°æLineRenderer (Body)ä¸çæ¯ä¸ªèç¹è®¾ä¸ºå
¶æ£ç¡®çä½ç½®ï¼ä»¥æ¤å®æè¿ä¸ªå¾ªç¯ã
ããåé ç½æ ¼
ããè¿æ£æ¯å®æ£æçå°æ¹ã
ããæ们æèªå·±ç线段ï¼ä½æ们并没ææ°´ä½æ¬èº«ãæ们è¦ä½¿ç¨ç½æ ¼æ¥å¶ä½ï¼å¦ä¸æ示ï¼
ããfor (int i = 0; i < edgecount; i++)
ãã{
ããmeshes[i] = new Mesh();
ããç°å¨ï¼ç½æ ¼åå¨äºä¸ç³»ååéãé¦ä¸ªåéç¸å½ç®åï¼å®å
å«äºææ顶ç¹ï¼æ转è§ï¼ã
ããunity-water-Firstmesh(from gamedevelopment)
ãã该å¾è¡¨æ¾ç¤ºäºæ们æéçç½æ ¼ç段çæ ·åã第ä¸ä¸ªç段ä¸ç顶ç¹è¢«æ 注åºæ¥äºãæ们æ»å
±éè¦4个顶ç¹ã
ããVector3[] Vertices = new Vector3[4];
ããVertices[0] = new Vector3(xpositions[i], ypositions[i], z);
ããVertices[1] = new Vector3(xpositions[i + 1], ypositions[i + 1], z);
ããVertices[2] = new Vector3(xpositions[i], bottom, z);
ããVertices[3] = new Vector3(xpositions[i+1], bottom, z);
ããç°å¨å¦ä½ æè§ï¼é¡¶ç¹0å¤äºå·¦ä¸è§ï¼1å¤äºå³ä¸è§ï¼2æ¯å·¦ä¸è§ï¼3æ¯å³ä¸è§ãæ们ä¹åè¦è®°ä½ã
ããç½æ ¼æéç第äºä¸ªæ§è½å°±æ¯UVãç½æ ¼æ¥æ纹çï¼UVä¼éæ©æ们æ³æ·åçé£é¨å纹çãå¨è¿ç§æ
åµä¸ï¼æ们åªæ³è¦å·¦ä¸è§ï¼å³ä¸è§ï¼å³ä¸è§åå³ä¸è§ç纹çã
ããVector2[] UVs = new Vector2[4];
ããUVs[0] = new Vector2(0, 1);
ããUVs[1] = new Vector2(1, 1);
ããUVs[2] = new Vector2(0, 0);
ããUVs[3] = new Vector2(1, 0);
ããç°å¨æ们åéè¦è¿äºæ°æ®äºãç½æ ¼æ¯ç±ä¸è§å½¢ç»æçï¼æ们ç¥éä»»ä½å边形é½æ¯ç±ä¸¤ä¸ªä¸è§å½¢ç»æçï¼æ以ç°å¨æ们éè¦åè¯ç½æ ¼å®å¦ä½ç»å¶è¿äºä¸è§å½¢ã
ããunity-water-Tris(from gamedevelopment)
ããççå«æèç¹é¡ºåºæ 注ç转è§ãä¸è§å½¢Aè¿æ¥èç¹0ï¼1ï¼ä»¥å3ï¼ä¸è§å½¢Bè¿æ¥èç¹3ï¼2ï¼1ãå æ¤æ们æ³å¶ä½ä¸ä¸ªå
å«6个æ´æ°çéµåï¼
ããint[] tris = new int[6] { 0, 1, 3, 3, 2, 0 };
ããè¿å°±åé äºæ们çå边形ãç°å¨æ们è¦è®¾ç½®ç½æ ¼çå¼ã
ããmeshes[i].vertices = Vertices;
ããmeshes[i].uv = UVs;
ããmeshes[i].triangles = tris;
ããç°å¨æ们已ç»æäºèªå·±çç½æ ¼ï¼ä½æ们没æå¨åºæ¯æ¯æ¸²æå®ä»¬ç游æ对象ãæ以æ们å°ä»å
æ¬ä¸ä¸ªç½æ ¼æ¸²æå¨åçç½è¿æ»¤å¨çwatermeshé¢å¶ä»¶æ¥åé å®ä»¬ã
ããmeshobjects[i] = Instantiate(watermesh,Vector3.zero,Quaternion.identity) as GameObject;
ããmeshobjects[i].GetComponent<MeshFilter>().mesh = meshes[i];
ããmeshobjects[i].transform.parent = transform;
ããæ们设置äºç½æ ¼ï¼ä»¤å
¶æ为水ä½ç®¡çå¨çå项ã
ããåé 碰æææ
ããç°å¨æ们è¿éè¦èªå·±ç碰æå¨ï¼
ããcolliders[i] = new GameObject();
ããcolliders[i].name = âTriggerâ;
ããcolliders[i].AddComponent<BoxCollider2D>();
ããcolliders[i].transform.parent = transform;
ããcolliders[i].transform.position = new Vector3(Left + Width * (i + 0.5f) / edgecount, Top â 0.5f, 0);
ããcolliders[i].transform.localScale = new Vector3(Width / edgecount, 1, 1);
ããcolliders[i].GetComponent<BoxCollider2D>().isTrigger = true;
ããcolliders[i].AddComponent<WaterDetector>();
ããè³æ¤ï¼æ们å¶ä½äºæ¹å½¢ç¢°æå¨ï¼ç»å®ä»¬ä¸ä¸ªå称ï¼ä»¥ä¾¿å®ä»¬ä¼å¨åºæ¯ä¸æ¾å¾æ´æ´æ´ä¸ç¹ï¼å¹¶ä¸å次å¶ä½æ°´ä½ç®¡çå¨çæ¯ä¸ªå项ãæ们å°å®ä»¬çä½ç½®è®¾ç½®äºä¸¤ä¸ªèç¹ä¹ç¹ï¼è®¾ç½®å¥½å¤§å°ï¼å¹¶ä¸ºå
¶æ·»å äºWaterDetectorç±»ã
ããç°å¨æ们æ¥æèªå·±çç½æ ¼ï¼æ们éè¦ä¸ä¸ªå½æ°éçæ°´ä½ç§»å¨è¿è¡æ´æ°ï¼
ããvoid UpdateMeshes()
ãã{
ããfor (int i = 0; i < meshes.Length; i++)
ãã{
ããVector3[] Vertices = new Vector3[4];
ããVertices[0] = new Vector3(xpositions[i], ypositions[i], z);
ããVertices[1] = new Vector3(xpositions[i+1], ypositions[i+1], z);
ããVertices[2] = new Vector3(xpositions[i], bottom, z);
ããVertices[3] = new Vector3(xpositions[i+1], bottom, z);
ããmeshes[i].vertices = Vertices;
ãã}
ãã}
ããä½ å¯è½æ³¨æå°äºè¿ä¸ªå½æ°åªä½¿ç¨äºæ们ä¹åç¼åç代ç ãå¯ä¸çåºå«å¨äºè¿æ¬¡æ们并ä¸éè¦è®¾ç½®ä¸è§å½¢çUVï¼å 为è¿äºä»ç¶ä¿æä¸åã
ããæ们çä¸ä¸æ¥ä»»å¡æ¯è®©æ°´ä½æ¬èº«è¿è¡ãæ们å°ä½¿ç¨FixedUpdate()éå¢å°æ¥è°æ´å®ä»¬ã
ããvoid FixedUpdate()
ãã{
ããæ§è¡ç©çæºå¶
ããé¦å
ï¼æ们å°æHookeå®å¾åEuleræ¹æ³ç»åå¨ä¸èµ·æ¾å°æ°åæ ãå éåé度ã
ããHookeå®å¾æ¯F=kxï¼è¿éçFæ¯æç±æ°´æµäº§ççåï¼è®°ä½ï¼æ们å°ææ°´ä½è¡¨é¢æ¨¡æ为水æµï¼ï¼kæ¯ææ°´æµç常éï¼xåæ¯ä½ç§»ãæ们çä½ç§»å°æ为æ¯ä¸ªèç¹çyåæ åå»èç¹çåºæ¬é«åº¦ã
ããä¸ä¸æ¥ï¼æ们å°æ·»å ä¸ä¸ªä¸åçé度ææ¯ä¾çé»å°¼å ç´ æ¥åå¼±åã
ããfor (int i = 0; i < xpositions.Length ; i++)
ãã{
ããfloat force = springconstant * (ypositions[i] â baseheight) + velocities[i]*damping ;
ããaccelerations[i] = -force;
ããypositions[i] += velocities[i];
ããvelocities[i] += accelerations[i];
ããBody.SetPosition(i, new Vector3(xpositions[i], ypositions[i], z));
ãã}
ããEuleræ¹æ³å¾ç®åï¼æ们åªè¦åé度添å å éï¼åæ¯å¸§åæ å¢å é度ã
ãã注ï¼æåªæ¯å设æ¯ä¸ªèç¹çè´¨é为1ï¼ä½ä½ å¯è½ä¼æ³ç¨ï¼
ããaccelerations[i] = -force/mass;
ããç°å¨æ们å°åé æ³¢ä¼ æã以ä¸èç¹æ¯æ ¹æ®Michael Hoffmançæç¨è°æ´èæ¥çï¼
ããfloat[] leftDeltas = new float[xpositions.Length];
ããfloat[] rightDeltas = new float[xpositions.Length];
ããå¨æ¤ï¼æ们è¦åé 两个éµåãé对æ¯ä¸ªèç¹ï¼æ们å°æ£æ¥ä¹åèç¹çé«åº¦ï¼ä»¥åå½åèç¹çé«åº¦ï¼å¹¶å°äºè
å·®å«æ¾å
¥leftDeltasã
ããä¹åï¼æ们å°æ£æ¥åç»èç¹çé«åº¦ä¸å½åæ£æ¥èç¹çé«åº¦ï¼å¹¶å°äºè
çå·®å«æ¾å
¥rightDeltasï¼æ们å°ä¹ä»¥ä¸ä¸ªä¼ æ常éæ¥å¢å ææå¼ï¼ã
ããfor (int j = 0; j < 8; j++)
ãã{
ããfor (int i = 0; i < xpositions.Length; i++)
ãã{
ããif (i > 0)
ãã{
ããleftDeltas[i] = spread * (ypositions[i] â ypositions[i-1]);
ããvelocities[i - 1] += leftDeltas[i];
ãã}
ããif (i < xpositions.Length â 1)
ãã{
ããrightDeltas[i] = spread * (ypositions[i] â ypositions[i + 1]);
ããvelocities[i + 1] += rightDeltas[i];
ãã}
ãã}
ãã}
ããå½æ们éé½ææçé«åº¦æ°æ®æ¶ï¼æ们æåå°±å¯ä»¥æ´¾ä¸ç¨åºäºãæ们æ æ³æ¥çå°æå³ç«¯çèç¹å³ä¾§ï¼æè
æ大左端çèç¹å·¦ä¾§ï¼å æ¤åºæ¡ä»¶å°±æ¯i > 0以åi < xpositions.Length â 1ã
ããå æ¤ï¼è¦æ³¨ææ们å¨ä¸ä¸ªå¾ªç¯ä¸å
å«æ´ç代ç ï¼å¹¶è¿è¡å®8次ãè¿æ¯å 为æ们æ³ä»¥å°éèå¤æ¬¡çæ¶é´è¿è¡è¿ä¸è¿ç¨ï¼èä¸æ¯è¿è¡ä¸æ¬¡å¤§åè¿ç®ï¼å 为è¿ä¼åå¼±æµå¨æ§ã
ããæ·»å æ°´è±
ããç°å¨æ们已ç»æäºæµå¨çæ°´ä½ï¼ä¸ä¸æ¥å°±éè¦è®©å®æº
èµ·æ°´è±ï¼
ãã为æ¤ï¼æ们è¦å¢å ä¸ä¸ªç§°ä¸ºSplash()çå½æ°ï¼å®ä¼æ£æ¥æ°´è±çXåæ ï¼ä»¥åå®æå»ä¸çä»»ä½ç©ä½çé度ãå°å
¶è®¾ç½®ä¸ºå
¬å¼ç¶æï¼è¿æ ·æ们å¯ä»¥å¨ä¹åç碰æå¨ä¸è°ç¨å®ã
ããpublic void Splash(float xpos, float velocity)
ãã{
ããé¦å
ï¼æ们åºè¯¥ç¡®ä¿ç¹å®çåæ ä½äºæ们水ä½çèå´ä¹å
ï¼
ããif (xpos >= xpositions[0] && xpos <= xpositions[xpositions.Length-1])
ãã{
ããç¶åæ们å°è°æ´xposï¼è®©å®åºç°å¨ç¸å¯¹äºæ°´ä½èµ·ç¹çä½ç½®ä¸ï¼
ããxpos -= xpositions[0];
ããä¸ä¸æ¥ï¼æ们å°æ¾å°å®ææ¥è§¦çèç¹ãæ们å¯ä»¥è¿æ ·è®¡ç®ï¼
ããint index = Mathf.RoundToInt((xpositions.Length-1)*(xpos / (xpositions[xpositions.Length-1] â xpositions[0])));
ããè¿å°±æ¯å®çè¿è¡æ¹å¼ï¼
ãã1.æ们éåç¸å¯¹äºæ°´ä½å·¦ä¾§è¾¹ç¼ä½ç½®çæ°´è±ä½ç½®(xpos)ã
ãã2.æ们å°ç¸å¯¹äºæ°´ä½å·¦ä¾§è¾¹ç¼ççå³ä¾§ä½ç½®è¿è¡ååã
ãã3.è¿è®©æ们ç¥éäºæ°´è±æå¨çä½ç½®ãä¾å¦ï¼ä½äºæ°´ä½ååä¹ä¸å¤çæ°´è±çå¼å°±æ¯0.75ã
ãã4.æ们å°æè¿ä¸æ°åä¹ä»¥è¾¹ç¼çæ°éï¼è¿å°±å¯ä»¥å¾å°æ们水è±ææ¥è¿çèç¹ã
ããvelocities[index] = velocity;
ããç°å¨æ们è¦è®¾ç½®å»ä¸æ°´é¢çç©ä½çé度ï¼ä»¤å
¶ä¸èç¹é度ä¸è´ï¼ä»¥æ ·èç¹å°±ä¼è¢«è¯¥ç©ä½æå
¥æ·±å¤ã
ããParticle-System(from gamedevelopment)
ãã注ï¼ä½ å¯ä»¥æ ¹æ®èªå·±çéæ±æ¹åè¿æ¡çº¿æ®µãä¾å¦ï¼ä½ å¯ä»¥å°å
¶é度添å å°å½åé度ï¼æè
使ç¨å¨éèéé度ï¼å¹¶é¤ä»¥ä½ èç¹çè´¨éã
ããç°å¨ï¼æ们æ³å¶ä½ä¸ä¸ªå°äº§çæ°´è±çç²åç³»ç»ãæ们æ©ç¹å®ä¹ï¼å°å
¶ç§°ä¸ºâsplashâãè¦ç¡®ä¿ä¸è¦è®©å®ä¸Splash()ç¸æ··æ·ã
ããé¦å
ï¼æ们è¦è®¾ç½®æ°´è±çåï¼ä»¥ä¾¿è°æ´ç©ä½çé度ï¼
ããfloat lifetime = 0.93f + Mathf.Abs(velocity)*0.07f;
ããsplash.GetComponent<ParticleSystem>().startSpeed = 8+2*Mathf.Pow(Mathf.Abs(velocity),0.5f);
ããsplash.GetComponent<ParticleSystem>().startSpeed = 9 + 2 * Mathf.Pow(Mathf.Abs(velocity), 0.5f);
ããsplash.GetComponent<ParticleSystem>().startLifetime = lifetime;
ããå¨æ¤ï¼æ们è¦éåç²åï¼è®¾ç½®å®ä»¬ççå½å¨æï¼ä»¥å
ä»ä»¬å»ä¸æ°´é¢å°±å¿«éæ¶å¤±ï¼å¹¶ä¸æ ¹æ®å®ä»¬é度çç´è§è®¾ç½®é度ï¼ä¸ºå°å°çæ°´è±å¢å ä¸ä¸ªå¸¸éï¼ã
ããä½ å¯è½ä¼çç代ç å¿æ³ï¼â为ä»ä¹è¦ä¸¤æ¬¡è®¾ç½®startSpeedï¼âä½ è¿æ ·æ³æ²¡æéï¼é®é¢å¨äºï¼æ们使ç¨ä¸ä¸ªèµ·å§é度设置为â两个常éé´çéæºæ°âè¿ç§ç²åç³»ç»ï¼Shurikenï¼ãä¸å¹¸çæ¯ï¼æ们并没æ太å¤ä»¥èæ¬è®¿é®Shurikençéå¾ ï¼æ以为äºè·å¾è¿ä¸è¡ä¸ºï¼æ们å¿
须两次设置è¿ä¸ªå¼ã
温馨提示:答案为网友推荐,仅供参考