二次元日系游戏制作工具 - live2dSDK项目实战
导入素材创建场景
游戏开始场景制作
星星闪耀动画的制作
特效孵化器
添加一个EffectSpawn脚本,用来泼撒花瓣和爱心
using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 特效孵化器
/// </summary>
public class EffectSpawn : MonoBehaviour {public GameObject[] effectGos;public Transform canvasTrans;// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {}private void CreateEffectGo(){int randomIndex = Random.Range(0, 2);GameObject effectGo = Instantiate(effectGos[randomIndex], transform.position, transform.rotation);effectGo.transform.SetParent(canvasTrans);}
}
在屏幕右上角创建空物体,将脚本挂载在它上面,并添加预制体
特效的移动脚本
在EffectSpawn脚本的Start力添加以下代码,让花瓣和爱心两秒随机生成一次
InvokeRepeating("CreateEffectGo", 0, 2);
在花瓣和爱心预制体上创建新的脚本EffectMove,用来控制物体的移动
using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 特效移动
/// </summary>
public class EffectMove : MonoBehaviour {public float moveSpeed = 5;// Use this for initializationvoid Start () {Destroy(gameObject, 10);}// Update is called once per framevoid Update () {transform.Translate(-transform.right * moveSpeed * Time.deltaTime);}
}
特效的完善
首先在EffectSpawn里修改孵化器的角度为45度
transform.rotation = Quaternion.Euler(new Vector3(0, 0, Random.Range(0, 45)));
然后在EffectMove里添加复合运动的代码,让特效看起来更真实
private float timeVal;private int randomYPos;void Update () {transform.Translate(-transform.right * moveSpeed * Time.deltaTime);if(timeVal >= 1){timeVal = 0;randomYPos = Random.Range(-1, 2);}else{transform.Translate(transform.up * randomYPos * Time.deltaTime * moveSpeed / 5);timeVal += Time.deltaTime;}}
添加音乐,然后给Buttont添加加载Game场景的代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;/// <summary>
/// 开始按钮的功能
/// </summary>
public class LoadGame : MonoBehaviour
{public void OnButtonStartClick(){SceneManager.LoadScene(1);}}
点击Start就加载到Game场景
搭建游戏场景导入Live2d框架
使用框架来加载Live2d模型
输入模型Json文件的地址就可以显示出来模型
完成金币显示的UI
游戏场景UI的制作
游戏管理的创建
创建GameManager脚本用来管理金币、好感度和日期。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class GameManager : MonoBehaviour
{//单例private static GameManager _instance;public static GameManager Instance{get{return _instance;}}//玩家属性public int gold;public int favor;public int leftDays;public Text goldText;public Text favorTest;public Text dateText;private void Awake(){_instance = this;gold = favor = 0;leftDays = 20;}// Update is called once per framevoid Update(){}
}
更新文本UI的方法
在GamaManger里面添加更新UI的方法
//更新玩家属性UI显示private void UpdateUI(){goldText.text = gold.ToString();favorTest.text = favor.ToString();dateText.text = leftDays.ToString();}//金币数额的变化方法public void ChangeGold(int goldValue){gold += goldValue;if (gold <= 0)gold = 0;UpdateUI();}//好感度数额的变化方法public void ChangeFavor(int favorValue){favor += favorValue;if (favor <= 0)favor = 0;UpdateUI();}
天亮天黑方法
首先添加三个状态来控制天亮天黑
//天黑天亮属性public Image mask;private bool toAnotherDay;private bool toBeDay;
添加天亮天黑的方法
//天黑public void ToDark(){mask.color += new Color(0, 0, 0, Mathf.Lerp(0, 1, 0.1f));if(mask.color.a >= 0.8f){mask.color = new Color(0, 0, 0, 1);toBeDay = true;UpdateUI();}}//天亮public void ToDay(){mask.color -= new Color(0, 0, 0, Mathf.Lerp(1, 0, 0.1f));if (mask.color.a <= 0.2f){mask.color = new Color(0, 0, 0, 0);toAnotherDay = false;toBeDay = false;}}
天黑天亮方法的具体运行与打工按钮的制作
完善天亮天黑的办法
//天黑天亮属性public Image mask;public bool toAnotherDay;public bool toBeDay;private float timeVal;
void Update(){//是否过渡到另外一天if (toAnotherDay){if (toBeDay){//天亮if (timeVal >= 2){ToDay();timeVal = 0;}else{timeVal += Time.deltaTime;}}else{//天黑ToDark();}}}
添加打工的分类
打工与对话框UI的制作
打工按钮事件的处理
public GameObject actionBtns;//工作public GameObject workBtns;
添加方法ClickWorkBtn()
public void ClickWorkBtn(){actionBtns.SetActive(false);workBtns.SetActive(true);}
打工后获取金币的方法
首先添加几个属性
public LAppModelProxy lAppModelProxy;public GameObject talkLine;public Text talkLineText;//工作public GameObject workBtns;public Sprite[] workSprites;public Image workImage;public GameObject workUI;
添加点击工作以及赚钱的代码
public void ClickWorkBtn(){actionBtns.SetActive(false);workBtns.SetActive(true);lAppModelProxy.SetVisible(false);//隐藏模型}public void GetMoney(int workIndex){workBtns.SetActive(false);ChangeGold((4 - workIndex) * 20);workImage.sprite = workSprites[workIndex];workUI.SetActive(true);talkLine.SetActive(true);talkLineText.text = "劳动最光荣";}
打工流程的测试
添加一个即将天黑的代码,用来点击控制toAnotherDya
//即将天黑public void ToBeDark(){toAnotherDay = true;}
给各种属性进行赋值
进行测试
重置所有UI显示的方法
添加重置UI显示的办法
//重置所有UIprivate void ResetUI(){workUI.SetActive(false);talkLine.SetActive(false);actionBtns.SetActive(true);lAppModelProxy.SetVisible(true);leftDays--;UpdateUI();}
并在天黑的代码里进行调用
//天黑public void ToDark(){mask.color += new Color(0, 0, 0, Mathf.Lerp(0, 1, 0.1f));if(mask.color.a >= 0.8f){mask.color = new Color(0, 0, 0, 1);toBeDay = true;UpdateUI();ResetUI();}}
聊天UI的制作
聊天按钮的事件
添加聊天的属性
//聊天public GameObject chatUI;
添加聊天按钮的事件
//聊天public void ClickChatBtn(){actionBtns.SetActive(false);chatUI.SetActive(true);}
使用框架的方法播放动作
根据好感度不同播放不同的动画
//聊天public void ClickChatBtn(){actionBtns.SetActive(false);chatUI.SetActive(true);if(favor >= 100){lAppModelProxy.GetModel().StartMotion("tap_body", 1, 2);}else{lAppModelProxy.GetModel().StartMotion("tap_body", 0, 2);}}
使用框架的方法设置表情
public void GetFavor(int chatIndex){chatUI.SetActive(false);talkLine.SetActive(true);switch (chatIndex){case 0:if (favor > 20){ChangeFavor(10);talkLineText.text = "谢谢啊,二狗子,你也很帅。。。";}else{ChangeFavor(2);talkLineText.text = "哦,谢谢。";lAppModelProxy.GetModel().SetExpression("f08");}break;case 1:if (favor > 60){ChangeFavor(20);talkLineText.text = "啊。。哦,不好意思,谢谢哈。。。";lAppModelProxy.GetModel().SetExpression("f07");}else{ChangeFavor(2);talkLineText.text = "哦,谢谢。";lAppModelProxy.GetModel().SetExpression("f08");}break;default:break;}}
聊天功能的完善
public void GetFavor(int chatIndex){chatUI.SetActive(false);talkLine.SetActive(true);switch (chatIndex){case 0:if (favor > 20){ChangeFavor(10);talkLineText.text = "谢谢啊,二狗子,你也很帅。。。";}else{ChangeFavor(2);talkLineText.text = "哦,谢谢。";lAppModelProxy.GetModel().SetExpression("f08");}break;case 1:if (favor > 60){ChangeFavor(20);talkLineText.text = "啊。。哦,不好意思,谢谢哈。。。";lAppModelProxy.GetModel().SetExpression("f07");}else{ChangeFavor(-20);talkLineText.text = "你看错了!你手拿开,真不礼貌。";lAppModelProxy.GetModel().SetExpression("f03");}break;case 2:if (favor > 100){ChangeFavor(40);talkLineText.text = "那。。咱们一起去吃饭,下午去哪玩?";lAppModelProxy.GetModel().SetExpression("f05");}else{ChangeFavor(-40);talkLineText.text = "你这人说话怎么这样啊,我又没得罪你。";lAppModelProxy.GetModel().SetExpression("f04");}break;default:break;}
解决文本因自动适应而字体过小的方法
在代码里面添加"\n"换行即可。
在ResetUI里添加表情重置。
lAppModelProxy.GetModel().SetExpression("f01");
学校门口约会的情况
首先定义个两个约会使用到的变量
//约会public SpriteRenderer bgImage;public Sprite[] dateSprites;
然后开始写约会的方法
/// <summary>/// 约会/// </summary>public void ClickDataBtn(){actionBtns.SetActive(false);talkLine.SetActive(true);int randomNum = Random.Range(1, 4);bool hasEnoughGold = false;bgImage.sprite = dateSprites[randomNum];switch(randomNum){case 1:if(gold >= 50){ChangeGold(-50);ChangeFavor(150);talkLineText.text = "学校门口原来有这么好玩的地方。" + "\n" +"今天谢谢你了,二狗子。";hasEnoughGold = true;}else{talkLineText.text = "没事,不用在意,我最近零花钱比较多。";ChangeGold(-50);}break;default:break;}}
约会方法的完善
/// <summary>/// 约会/// </summary>public void ClickDataBtn(){actionBtns.SetActive(false);talkLine.SetActive(true);int randomNum = Random.Range(1, 4);bool hasEnoughGold = false;bgImage.sprite = dateSprites[randomNum];switch(randomNum){case 1:if(gold >= 50){ChangeGold(-50);ChangeFavor(150);talkLineText.text = "学校门口原来有这么好玩的地方。" + "\n" +"今天谢谢你了,二狗子。";hasEnoughGold = true;}else{talkLineText.text = "没事,不用在意,我最近零花钱比较多。";ChangeGold(-50);}break;case 2:if (gold >= 150){ChangeGold(-150);ChangeFavor(300);talkLineText.text = "蟹黄汤包,烤鸭还有其他的甜品真的都太好吃了!" + "\n" +"谢谢招待!";hasEnoughGold = true;}else{talkLineText.text = "下次有机会你再请我吃饭吧。";ChangeFavor(-150);}break;case 3:if (gold >= 300){ChangeGold(-300);ChangeFavor(500);talkLineText.text = "今天真的很开心," + "\n" +"还有,谢谢你送的礼物,你人真好。。。";hasEnoughGold = true;}else{talkLineText.text = "那个娃娃真的好可爱哦,好想要。。。";ChangeFavor(-300);}break;default:break;}if (hasEnoughGold){lAppModelProxy.GetModel().StartMotion("pinch_in", 0, 2);}else{lAppModelProxy.GetModel().StartMotion("flick_head", 0, 2);}}
表白方法的编写
/// <summary>/// 表白/// </summary>public void ClickLoveBtn(){actionBtns.SetActive(false);talkLine.SetActive(true);if(favor >= 1500){//表白成功talkLineText.text = "谢谢你啊,二狗子。其实我也喜欢你很久了," + "/n" +"自己喜欢的那个人也正好喜欢着自己," + "\n" +"真好,希望你可以让我永远陪着你。";lAppModelProxy.GetModel().StartMotion("pinch_out", 0, 2);}
表白功能的测试
完善表白功能的代码
/// <summary>/// 表白/// </summary>public void ClickLoveBtn(){actionBtns.SetActive(false);talkLine.SetActive(true);if(favor >= 1500){//表白成功talkLineText.text = "谢谢你啊,二狗子。其实我也喜欢你很久了," + "/n" +"自己喜欢的那个人也正好喜欢着自己," + "\n" +"真好,希望你可以让我永远陪着你。";lAppModelProxy.GetModel().StartMotion("pinch_out", 0, 2);lAppModelProxy.GetModel().SetExpression("f07");}else{//表白失败talkLineText.text = "二狗子,你。。你," + "\n" +"突然的表白的吓我一跳" + "\n" +"你真的喜欢我是吗?" + "\n" +"可是。。。我们还不够了解彼此。。。";lAppModelProxy.GetModel().StartMotion("shake", 0, 2);lAppModelProxy.GetModel().SetExpression("f04");}}
野生Live2d模型素材文件的处理与BOSS脚本的创建
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Live2DSimpleModel : MonoBehaviour
{public TextAsset modelFile;public Texture2D texture;public TextAsset idleMotionFile;public GameObject manatsu;// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){}
}
Boss脚本的成员变量的定义与Start方法的编写
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using live2d;public class Live2DSimpleModel : MonoBehaviour
{public TextAsset modelFile;public Texture2D texture;public TextAsset idleMotionFile;public GameObject manatsu;private Live2DModelUnity live2DModel;private Matrix4x4 live2DCanvasPos;private Live2DMotion live2DMotionIdle;private MotionQueueManager motionQueueManager;private EyeBlinkMotion eyeBlinkMotion;// Start is called before the first frame updatevoid Start(){Live2D.init();live2DModel = Live2DModelUnity.loadModel(modelFile.bytes);live2DModel.setTexture(0, texture);float modelWidth = live2DModel.getCanvasWidth();live2DCanvasPos = Matrix4x4.Ortho(0, modelWidth, modelWidth, 0, -50.0f, 50.0f);live2DMotionIdle = Live2DMotion.loadMotion(idleMotionFile.bytes);live2DMotionIdle.setLoop(true);motionQueueManager = new MotionQueueManager();eyeBlinkMotion = new EyeBlinkMotion();motionQueueManager.startMotion(live2DMotionIdle);}// Update is called once per framevoid Update(){}
}
Boss渲染的完成与位置和比例的设置
完善Boss的代码
// Update is called once per framevoid Update(){live2DModel.setMatrix(transform.localToWorldMatrix * live2DCanvasPos);motionQueueManager.updateParam(live2DModel);eyeBlinkMotion.setParam(live2DModel);live2DModel.update();}private void OnRenderObject(){live2DModel.draw();}
Boss移动方法的编写
首先创建几个变量
public float moveSpeed;private Vector3 initPos;//判断当前Boss是否被打败private bool isDefeat;
initPos = transform.position;
然后在Update里面添加Boss移动的方法
if (GameManager.Instance.gameOver){return;}//判断当前Boss是否追赶上Manatsuif (manatsu.transform.position.x - transform.position.x < 3){GameManager.Instance.gameOver = true;}if (isDefeat){transform.position = Vector3.Lerp(transform.position, initPos, 0.2f);}else{transform.Translate(Vector3.right * moveSpeed * Time.deltaTime);}
击打Boss的方法
创建一个计数变量,用来记录打击次数
private int hitCount;
private void OnMouseDown(){if (GameManager.Instance.gameOver){return;}if (hitCount >= 20){isDefeat = true;}else{hitCount++;}}
在Manatsu身上的脚本添加下列属性,以便Manatsu淘宝
public bool isRunningAway;public float moveSpeed;
Manatsu的逃跑方法
首先在GameManager中添加一个属性,用来控制BadBoy
public Live2DSimpleModel badBoyScript;
在Manatsu身上的脚本中添加逃跑方法,首要记录初始位置
initPos = transform.position;
然后在Update里添加逃跑方法
if(GameManager.Instance != null){if (GameManager.Instance.gameOver){isRunningAway = false;return;}}if (isRunningAway){transform.Translate(Vector3.right * moveSpeed * Time.deltaTime);}if (GameManager.Instance != null){if (GameManager.Instance.badBoyScript.isDefeat){transform.position = Vector3.Lerp(transform.position, initPos, 0.1f);}}
Boss的有关逻辑处理
在GameManager中添加一个对话框
public GameObject badBoyTalkLine;
然后添加一个产生坏男孩和关闭对话框的方法
//产生坏男孩private void CreateBadBoy(){lAppModelProxy.isRunningAway = true;badBoyScript.gameObject.SetActive(true);lAppModelProxy.GetModel().SetExpression("f04");actionBtns.SetActive(false);badBoyTalkLine.SetActive(true);}public void CloseBadBoyTalkLine(){badBoyTalkLine.SetActive(false);}
然后在ResetUI里面进行调用
//重置所有UIprivate void ResetUI(){workUI.SetActive(false);talkLine.SetActive(false);actionBtns.SetActive(true);lAppModelProxy.SetVisible(true);leftDays--;lAppModelProxy.GetModel().SetExpression("f01");bgImage.sprite = dateSprites[0];UpdateUI();if(leftDays == 5){CreateBadBoy();}}
击败Boss之后的文本提示与处理
public void DefeatBadBoy(){lAppModelProxy.GetModel().StartMotion("shake", 0, 2);talkLine.SetActive(true);talkLineText.text = "刚才吓死我了,谢谢你,二狗子" + "\n" +"要不是你及时救我,我就。。。" + "\n" +"你人好勇敢,真帅。。。";ChangeFavor(300);}
然后在Boss的脚本里进行调用
if (hitCount >= 20){isDefeat = true;GameManager.Instance.DefeatBadBoy();}
鼠标点击特效的动画制作
鼠标点击时产生特效的代码实现
首先添加两个变量,一个是预制体,一个是Canvas
//其他public GameObject clickEffect;public Canvas canvas;
在Update里添加产生特效的代码
//产生鼠标点击特效if (Input.GetMouseButtonDown(0)){Vector2 mousePos = Vector2.one;RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform, Input.mousePosition, canvas.worldCamera, out mousePos);GameObject go = Instantiate(clickEffect);go.transform.SetParent(canvas.transform);go.transform.localPosition = mousePos;}
游戏结束UI的制作
public GameObject gameOverBtns;
然后在Update里面进行判断
//游戏结束逻辑if (gameOver){talkLine.SetActive(true);gameOverBtns.SetActive(true);actionBtns.SetActive(false);}
游戏结束逻辑的编写
//游戏结束逻辑if (gameOver){talkLine.SetActive(true);gameOverBtns.SetActive(true);actionBtns.SetActive(false);if (favor >= 1500){talkLineText.text = "二狗子终于追到了乃木坂最腹黑的钓师——Manatsu。" + "\n" +"最后他们幸福的在一起了!";}else if(leftDays!=0&&favor < 1500){talkLineText.text = "Manatsu受到欺负时二狗子没有保护她," + "\n" +"从此他们决裂了。";}else{talkLineText.text = "二狗子在出国前没能获取到Manatsu的芳心," + "\n" +"于是他们没能在一起。";}}
添加按钮加载场景的代码
public void LoadScene(int sceneNum){SceneManager.LoadScene(sceneNum);}
给女主角换衣服
首先创建一个用来存储衣服的变量
public Texture2D manatusNewCloth;
然后在ResetUI里面进行使用
else if (leftDays == 10){Live2DModelUnity live2DModelUnity = lAppModelProxy.GetModel().GetLive2DModelUnity();live2DModelUnity.setTexture(2, manatusNewCloth);}
贴图混乱的原因与衣服制作的简单说明
必须要保证新服装的贴图和以前的贴图位置相同,这样才能避免贴图混乱。
按钮音乐播放方法的封装与音乐资源的赋值
//音乐播放private AudioSource audioSource;public AudioClip[] audioClips;
首先在Awake中进行初始化
audioSource = GetComponent<AudioSource>();audioSource.loop = true;audioSource.clip = audioClips[0];audioSource.Play();
添加Button点击的音效
public void PlayButtonSound(){audioSource.PlayOneShot(audioClips[8]);}
音乐添加的完成
完成音乐的添加。
二次元日系游戏制作工具 - live2dSDK项目实战相关推荐
- Unity学习笔记—二次元日系游戏制作(实践篇-游戏初始化场景制作)
原教程:siki:二次元日系游戏制作工具 - live2dSDK入门教程 http://www.sikiedu.com/my/course/282 (上)Unity学习笔记-二次元日系游戏制作(理论篇 ...
- Unity学习笔记—二次元日系游戏制作(理论篇)
原教程:siki:二次元日系游戏制作工具 - live2dSDK入门教程 http://www.sikiedu.com/my/course/282 一.准备工作 1.下载安装:Live2D_Cubis ...
- 《挂机游戏制作工具手册》挂机游戏制作工具基础知识
原文地址:http://orteil.dashnet.org/experiments/idlegamemaker/help 写在前面:对于挂机游戏的概念这里不作赘述和定义,本文翻译所指的是idle g ...
- 转载一个手机RPG游戏制作工具,仿造RPGXP写的
转载一个手机RPG游戏制作工具,仿造RPGXP写的 有朋友问有没有脚本编辑功能,大家注意啦: 有脚本编辑功能,可视化界面编辑脚本,和RMXP一样 经过一年的开发,手机RPG游戏制作工具--MobieG ...
- rpg人物制作软件_《RPG Maker MZ》——轻松上手的角色扮演游戏制作工具
<RPG Maker MZ>是由Gotcha Gotcha Games与KADOKAWA制作并由独立游戏厂商Degica发行的RPG Maker系列最新作品.整个系列工具有着多年的发展历史 ...
- 手机android游戏制作工具,主题制作工具手机下载_主题制作工具安卓版下载v1.0.4_3DM手游...
<主题制作工具>不是一款常规的主题类手机软件,它的功能主要是能够让用户进行自己的DIY.用户通过<主题制作工具>可以发挥自己的想象力,创造出拥有自己个性的手机主题,喜欢的朋友不 ...
- construct3html游戏制作工具,[官方新闻] construct3中的新编辑器 (测试一下机翻效果)...
许多游戏使用数组,字典或基于文本的格式来存储与项目相关的数据.例如,RPG可以使用字符表及其能力.然而构建体2没有提供任何可视的方式来准备该数据.我们在Construct 3中创建了三个全新的编辑器, ...
- python写一个游戏多少代码-Python项目实战之猜数字游戏(含实现代码)
猜数字游戏,旨在提高初学者对 Python 变量类型以及循环结构的使用. 此游戏的游戏规则如下:程序随机内置一个位于一定范围内的数字作为猜测的结果,由用户猜测此数字.用户每猜测一次,由系统提示猜测结果 ...
- html橙光游戏制作工具,橙光游戏制作工具全部视频教程
<橙光文字游戏制尴尬刁难象>是一款制作文字冒险.恋爱养成类游戏的软件,也是<彩虹文字游戏制作精灵>的升级版本.这个对象不需求编程.不需求漫长的进修过程,就可让你做出完整属于你 ...
最新文章
- 吸水间最低动水位标高_水库水位库容监测系统方案
- java与scala的区别 个位数以内的 就喜欢作者这么言简意赅的
- python实现树有多少种方法_教程 | 从头开始:用Python实现决策树算法
- boost::noncopyable介绍
- Oracle函数的定义
- 爬取京东商品分类和链接
- Linux下的parted工具的使用 GPT分区安装系统
- ipad iphone开发_如何在iPhone或iPad上更改应用程序的语言
- 在google play开放平台上closed texting如何删除_“爷青回”!如何抢先体验《英雄联盟》手游?这份攻略送给你...
- delphi 获取桌面路径
- 数通手稿留档——Frame Relay
- ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存
- LIO-SAM探秘第一章之论文解析
- chardet.detect()
- 无版权,全免费,请收藏这10个免费高清无权素材网站
- python 离散数学 判断单射 双射 满射
- ads1278_24位高性能模数转换器ADS1274/ADS1278及其应用
- Mac苹果电脑 安装virtualBox
- android微信群聊功能,Android仿微信群聊头像效果
- AI遮天传 ML-初识决策树
热门文章
- OpenHarmony 3.1 Release初体验 润和DAYU200开发套件
- Java、JSP社区蔬菜、食品交易平台
- 微信小程序直播消耗服务器流量,微信小程序直播私域流量过程要用多久
- Android程序员学WEB前端(9)-CSS(4)-商城首页Demo-Sublime
- 项目管理pmp考试要多少费用?
- 国内可用的ntp服务器地址
- 如何获得onblur中的值,从onBlur事件中获取新聚焦的元素(如果有)。
- Progressive Downloader for Mac(mac不限速下载器)
- python商品打折问题_python初学者-商品折扣问题
- PMBOK(项目管理知识体系)