导入素材创建场景

游戏开始场景制作

星星闪耀动画的制作

特效孵化器

添加一个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项目实战相关推荐

  1. Unity学习笔记—二次元日系游戏制作(实践篇-游戏初始化场景制作)

    原教程:siki:二次元日系游戏制作工具 - live2dSDK入门教程 http://www.sikiedu.com/my/course/282 (上)Unity学习笔记-二次元日系游戏制作(理论篇 ...

  2. Unity学习笔记—二次元日系游戏制作(理论篇)

    原教程:siki:二次元日系游戏制作工具 - live2dSDK入门教程 http://www.sikiedu.com/my/course/282 一.准备工作 1.下载安装:Live2D_Cubis ...

  3. 《挂机游戏制作工具手册》挂机游戏制作工具基础知识

    原文地址:http://orteil.dashnet.org/experiments/idlegamemaker/help 写在前面:对于挂机游戏的概念这里不作赘述和定义,本文翻译所指的是idle g ...

  4. 转载一个手机RPG游戏制作工具,仿造RPGXP写的

    转载一个手机RPG游戏制作工具,仿造RPGXP写的 有朋友问有没有脚本编辑功能,大家注意啦: 有脚本编辑功能,可视化界面编辑脚本,和RMXP一样 经过一年的开发,手机RPG游戏制作工具--MobieG ...

  5. rpg人物制作软件_《RPG Maker MZ》——轻松上手的角色扮演游戏制作工具

    <RPG Maker MZ>是由Gotcha Gotcha Games与KADOKAWA制作并由独立游戏厂商Degica发行的RPG Maker系列最新作品.整个系列工具有着多年的发展历史 ...

  6. 手机android游戏制作工具,主题制作工具手机下载_主题制作工具安卓版下载v1.0.4_3DM手游...

    <主题制作工具>不是一款常规的主题类手机软件,它的功能主要是能够让用户进行自己的DIY.用户通过<主题制作工具>可以发挥自己的想象力,创造出拥有自己个性的手机主题,喜欢的朋友不 ...

  7. construct3html游戏制作工具,[官方新闻] construct3中的新编辑器 (测试一下机翻效果)...

    许多游戏使用数组,字典或基于文本的格式来存储与项目相关的数据.例如,RPG可以使用字符表及其能力.然而构建体2没有提供任何可视的方式来准备该数据.我们在Construct 3中创建了三个全新的编辑器, ...

  8. python写一个游戏多少代码-Python项目实战之猜数字游戏(含实现代码)

    猜数字游戏,旨在提高初学者对 Python 变量类型以及循环结构的使用. 此游戏的游戏规则如下:程序随机内置一个位于一定范围内的数字作为猜测的结果,由用户猜测此数字.用户每猜测一次,由系统提示猜测结果 ...

  9. html橙光游戏制作工具,橙光游戏制作工具全部视频教程

    <橙光文字游戏制尴尬刁难象>是一款制作文字冒险.恋爱养成类游戏的软件,也是<彩虹文字游戏制作精灵>的升级版本.这个对象不需求编程.不需求漫长的进修过程,就可让你做出完整属于你 ...

最新文章

  1. 吸水间最低动水位标高_水库水位库容监测系统方案
  2. java与scala的区别 个位数以内的 就喜欢作者这么言简意赅的
  3. python实现树有多少种方法_教程 | 从头开始:用Python实现决策树算法
  4. boost::noncopyable介绍
  5. Oracle函数的定义
  6. 爬取京东商品分类和链接
  7. Linux下的parted工具的使用 GPT分区安装系统
  8. ipad iphone开发_如何在iPhone或iPad上更改应用程序的语言
  9. 在google play开放平台上closed texting如何删除_“爷青回”!如何抢先体验《英雄联盟》手游?这份攻略送给你...
  10. delphi 获取桌面路径
  11. 数通手稿留档——Frame Relay
  12. ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存
  13. LIO-SAM探秘第一章之论文解析
  14. chardet.detect()
  15. 无版权,全免费,请收藏这10个免费高清无权素材网站
  16. python 离散数学 判断单射 双射 满射
  17. ads1278_24位高性能模数转换器ADS1274/ADS1278及其应用
  18. Mac苹果电脑 安装virtualBox
  19. android微信群聊功能,Android仿微信群聊头像效果
  20. AI遮天传 ML-初识决策树

热门文章

  1. OpenHarmony 3.1 Release初体验 润和DAYU200开发套件
  2. Java、JSP社区蔬菜、食品交易平台
  3. 微信小程序直播消耗服务器流量,微信小程序直播私域流量过程要用多久
  4. Android程序员学WEB前端(9)-CSS(4)-商城首页Demo-Sublime
  5. 项目管理pmp考试要多少费用?
  6. 国内可用的ntp服务器地址
  7. 如何获得onblur中的值,从onBlur事件中获取新聚焦的元素(如果有)。
  8. Progressive Downloader for Mac(mac不限速下载器)
  9. python商品打折问题_python初学者-商品折扣问题
  10. PMBOK(项目管理知识体系)