认识数据

前言:学习数据开始~


1.PlayerPrefs类(是数据持久化的类,像游戏中的存档啊什么的)

(1)是个静态类,所以可以类名.调用此类里面的方法

(2)修改数据:类名.SetXXX(键,值)

<1>XXX可以是Int、Float、String三个类型中的任意一个

<2>键,是一个字符串类型的值

<3>值,是一个与XXX类型对应的值,我们修改这个值,这个值与键是对应的

(3)读取数据:类名.GetXXX(键,值)

<1>键,是一个字符串类型的值,相当于我们查找的时候用的索引,我们在Get的时候,只需要把键的值放在GetXXX方法中的参数位置就可以查找到跟键相对应的值

<2>值,是一个默认的值,可以不写这个参数,默认是0;写了的话,就是默认的值就你写的值,

<4>这个值是可以通过Set修改的,一旦修改就是修改的值,关掉程序依旧存在,修改完之后把Set的语句删除也还是修改完之后的值,不会影响,除非你使用删除方法

(4)判断是否存在键:类名.HasKey(键)

(5)删除数据:类名.DeleteKey(键)

(6)当该键没有Set的时候,我们使用Get去得到数据有以下几种情况:

<1>如果Get方法中没有写默认值,该键中存储的是相应类型的默认值(float、int的默认值是0,string的默认值是null)

<2>如果Get方法中写了默认值,那么该键中存储的就是这个默认值

(7)一般数据读取用在初始化数据的Start开始方法中,而修改数据一般放在Update更新方法中

代码贴图

2.TXT


(1)主要写了创建文件、读取文件、删除文件

(2)using System.IO;   //对文件输入输出操作的命名空间

<1>StreamWrite类(写入流)

1)以行的形式写入信息:对象.WriteLine(信息);

2)关闭写入流:对象.Close();

3)销毁写入流:对象.Dispose();

<2>StreamReader类(读取流)

1)关闭读取流:对象.Close();

2)销毁读取流:对象.Dispose();

<3>File静态类

1)删除文件:类名.Delete(文件绝对路径);

2)是否存在文件:类名.Exists(文件绝对路径);

3)创建文本:类名.CreateText(文件绝对路径);

4)添加文本:类名.AppendText(文件绝对路径);

<4>FileInfo类(文本)

1)文本是否存在:对象.Exists

2)创建文本:对象.CreateText();

3)添加文本:对象.AppendText();

4)打开文本:对象.OpenText();

(3)异常

<1>try{需要检查是否存在异常的代码块}catch(System.Exception){捕获到异常之后进行的操作}

(4)ArrayList (通过集合读取每一行的信息)

<1>添加元素:对象.Add(添加的元素);

(5)using UnityEditor;

<1>刷新Unity编辑界面:AssetDataBase.Refresh();

(6)判断平台做出对应处理

<1>方法一:预编译处理、预编译命令、宏命令

#if。。。#endif

<2>判断程序的平台是否是当前在运行的平台:

1)程序的平台:Application.platform

2)运行的平台:RuntimePlatform.枚举成员(不同的平台)

(7)数据路径:Application.dataPath

在不同的平台上的结果不同:

Unity 编辑器:<工程文件夹的路径>/Assets

Mac播放器:<到播放器应用的路径>/Contents

iPhone播放器:<到播放器应用的路径>//Data

Win播放器:< 包含可执行播发器的文件夹的路径>\Data

网络播放器:到播放器数据文件夹的绝对路径(没有实际的数据文件名称)

Flash: 到播放器数据文件夹的绝对路径(没有实际的数据文件名称)

借鉴文章:http://wiki.ceeger.com/script:unityengine:classes:application:application.datapath

(6)File和FileInfo的区别

File是静态类,对应整个文件系统进行操作,方法均为静态方法,如果只对文件进行少量的操作,如判断文件是否存在,或者对很多文件进行操作, 建议使用File类,因为可以避免频繁的创建和释放对象,可以减少系统的开销,

 FileInfo是普通类,它对应一个具体的文件进行操作,方法大部分是普通方法,它里面的操作可能也调用了File静态类的方法,如果只对一个文件进行大量操作,建议使用FileInfo类

在安全检查方面,通过File类去调用的方法,都要占用CPU一定的时间进行安全检查,即使使用File类不同的方法重复的对一个文件进行访问时,也是如此。而FileInfo类只在创建对象时,执行一次安全检查

代码贴图

3.CSV

(1)右击桌面背景创建Excel文件

(2)在里面输入内容,中间空几行,以备后用,凡事留一线

(3)点击文件,另存为,选择另存为的路径(切记这里不能直接强制把Excel文件的文件扩展名修改成csv或txt类型的,因为xlsx类型是以二进制格式进行存储的,csv和txt类型是以文本格式进行存储的,不同类型强制更改文件扩展名,打开会出现乱码)

(4)保存类型选择CSV UTF-8(逗号分隔),点击保存,会提示你是否修改格式点击是

(5)为了方便观察,我们把文件的文件扩展名显示出来

(6)首先文件图标不同,其次文件扩展名不同,其三.xlsx是以二进制格式存储,.csv是以文本格式存储

(7)因为csv和txt都是文本存储格式,所以我们可以直接强制把csv类型更改成txt类型

(8)更改之后,打开是这个样子,每一列以逗号分隔开

(9)把Test.txt文本拖到Unity编辑器中

(10)代码控制:通过行数和列名找到要找的信息

这里如果是用的动态加载则需要在Unity编辑器中创建Resources文件夹,在代码中写的路径要跟Unity编辑器中的Resources文件夹底下的路径对应上,不然会找不到目标文件

<1>TextAsset类

1)显示文本信息:对象.text

2)切割字符串:字符串对象.Split(以一个字符串切割);

<2>字符串数组:string[] 数组名

<3>字符串交错数组:string[][] 数组名

<4>其他类型转换成string类型:

方法一:string 对象名=其他类型的对象名.ToString();

方法二:string 对象名=string.Format("占位符",其他类型的对象名);

<5>转换类型:转换的类型.Parse(被转换的类型);

<6>单例模式:

1)声明一个单例:public static 此脚本类型 对象;

2)单例对象实例化为挂载此脚本的游戏对象;对象=this;

3)单例的使用:通过其他脚本中>>脚本名.单例对象.脚本中方法>>调用这个方法

找到要找的信息并打印

(11)随便把脚本挂载到一个游戏对象身上,然后运行就会在控制台打印出信息


4.JSON

(1)简介

JSON 指的是 JavaScript 对象表示法(JavaScriptObjectNotation)

JSON 是轻量级的文本数据交换格式

JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。

JSON 具有自我描述性,更易理解

参考网址:http://www.runoob.com/json/json-tutorial.html

JSON 是纯文本

JSON 具有"自我描述性"(人类可读)

JSON 具有层级结构(值中存在值)

JSON 可通过 JavaScript 进行解析

JSON 数据可使用 AJAX 进行传输

(2)语法

<1>JSON 语法规则

JSON 语法是 JavaScript 对象表示法语法的子集。

1)数据在名称/值对中

2)数据由逗号分隔

3)大括号保存对象

4)中括号保存数组

<2>JSON 名称/值对

JSON 数据的书写格式是:名称/值对。

名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值

<3>JSON 值

JSON 值可以是:

1)数字(整数或浮点数)

2)字符串(在双引号中)

3)逻辑值(true 或 false)

4)数组(在中括号中)

5)对象(在大括号中)

6)null

(3)使用

<1>创建一个Plugins(插件)文件夹,系统会先执行它里面的东西,比Awake方法之前执行,引用LitJson.dll文件,放在Plugins文件夹下

<2>选中LitJson,勾选上Any Platform(所有平台)

<3>通过代码:写入Json文本到文件、读取Json文本、从文件中读取Json文本

用字符串类型的一个对象来接收Json文本,用@取消转义

1)调用json操作的命名空间:using LitJson;

1.1)JsonMapper类

1.1.1)Json字符串转换成对象,用JsonData类型的对象接收:JsonMapper.ToObject(字符串对象);

1.1.2)对象转换成Json对象,用string类型的对象接收:JsonMapper.ToJson(对象);

1.2)JsonData类

1.2.1)读取一个对象的值:对象[键]

1.2.2)读取一个对象的某个数组元素中的值:对象[数组键][数组元素的索引值][当前数组元素的键]

1.2.3)读取一个对象的数组元素的个数:对象[数组键].Count

1.3)JsonWriter类

1.3.1)开始写入一组数据:对象.WriteObjectStart();

1.3.2)结束写入一组数据:对象.WriteObjectEnd();

//以上相当于Json文本中的一对花括号

1.3.3)键:对象.WritePropertyName(键);

1.3.4)值:对象.Write(值);

//以上相当于Json文本中的一组键值对,先写键再写值

1.3.5)开始写入数组:对象.WriteArrayStart();

1.3.6)结束写入数据:对象.WriteArrayEnd();

//以上相当于Json文本中的一组方括号

2)调用System.Text的命名空间:using System.Text;

2.1)StringBuilder类(修改字符串)

2.1.1)String 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。

相关StringBuilder文章:www.jb51.net/article/45832.htm

3)调用System.IO的命名空间:using System.IO;

3.1)DirectoryInfo类

3.1.1)给对象实例化所在路径构造方法:new DirectoryInfo(路径);

3.1.2)是否存在:对象.Exists

3.1.3)创建目录:对象.Create();

3.2)SteamWriter类

3.2.1)写入数据信息:对象.WriteLine(信息对象);

3.2.2)关闭写入流:对象.Close();

3.3.3)销毁写入流:对象.Dispose();

3.3)File类

3.3.1)编辑文本:对象.AppendText(绝对路径);

3.3.2)创建文本:对象.CreateText(绝对路径);


5.XML

5.1XML概念

XML 指可扩展标记语言(eXtensibleMarkupLanguage)。

XML 被设计用来传输和存储数据。

HTML 则被设计用来显示数据。

XML 是独立于软件和硬件的信息传输工具。

XML 是各种应用程序之间进行数据传输的最常用的工具。

5.2XML用途

XML 应用于 Web 开发的许多方面,常用于简化数据的存储和共享。

(1)XML 把数据从 HTML 分离

如果您需要在 HTML 文档中显示动态数据,那么每当数据改变时将花费大量的时间来编辑 HTML。

通过 XML,数据能够存储在独立的 XML 文件中。这样您就可以专注于使用 HTML/CSS 进行显示和布局,并确保修改底层数据不再需要对 HTML 进行任何的改变。

通过使用几行 JavaScript 代码,您就可以读取一个外部 XML 文件,并更新您的网页的数据内容。

(2)XML 简化数据共享

<1>在真实的世界中,计算机系统和数据使用不兼容的格式来存储数据。

XML 数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。

这让创建不同应用程序可以共享的数据变得更加容易。

(3)XML 简化数据传输

<1>对开发人员来说,其中一项最费时的挑战一直是在互联网上的不兼容系统之间交换数据。

由于可以通过各种不兼容的应用程序来读取数据,以 XML 交换数据降低了这种复杂性。

(4)XML 简化平台变更

<1>升级到新的系统(硬件或软件平台),总是非常费时的。必须转换大量的数据,不兼容的数据经常会丢失。XML 数据以文本格式存储。这使得 XML 在不损失数据的情况下,更容易扩展或升级到新的操作系统、新的应用程序或新的浏览器。

(5)XML 使您的数据更有用

<1>不同的应用程序都能够访问您的数据,不仅仅在 HTML 页中,也可以从 XML 数据源中进行访问。通过 XML,您的数据可供各种阅读设备使用(掌上计算机、语音设备、新闻阅读器等),还可以供盲人或其他残障人士使用。

(6)XML 用于创建新的互联网语言

<1>很多新的互联网语言是通过 XML 创建的。

5.3XML树结构

XML 文档形成了一种树结构,它从"根部"开始,然后扩展到"枝叶"。

5.4XML语法

(1)XML 必须包含根元素,它是所有其他元素的父元素

(2)XML 声明文件的可选部分,如果存在需要放在文档的第一行

(3)在 XML 中,省略关闭标签是非法的。所有元素都必须有关闭标签

(4)XML 标签对大小写敏感。必须使用相同的大小写来编写打开标签和关闭标签

(5)在 XML 中,所有元素都必须彼此正确地嵌套。

(6)在 XML 中,XML 的属性值必须加引号。

(7)在 XML 中,一些字符拥有特殊的意义。

如果您把字符 "<" 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始.

为了避免这个错误,请用实体引用来代替 "<" 字符

(8)XML 中的注释:<!--注释的内容-->

(9)在 XML 中,空格会被保留,在 XML 中,文档中的空格不会被删减。

(10)XML 以 LF 存储换行

<1>在 Windows 应用程序中,换行通常以一对字符来存储:回车符(CR)和换行符(LF)。

<2>在 Unix 和 Mac OSX 中,使用 LF 来存储新行。

<3>在旧的 Mac 系统中,使用 CR 来存储新行。

<4>XML 以 LF 存储换行

(11)XML 元素:指的是从(且包括)开始标签直到(且包括)结束标签的部分。

5.5代码:

学习:创建XML、添加XML、更改XML、读取XML

代码贴图

命名空间:

(1)using System.Xml;

类:XmlDocument(XML文档)、XmlNode(XML节点)、XmlElement(XML元素节点)、XmlNodeList(XML节点集合)

<1>XmlDocument

1)对象.CreateXmlDeclaration(版本号,所使用的编码,null);

2)把一个XmlNode类型的对象添加到对象当中:对象.AppendChild(节点对象);

3)创建一个元素节点:对象.CreateElement(元素节点的名字);

4)保存文档:对象.Save(保存的路径);

5)加载文档:对象.Load(加载的路径);

6)选择单个节点:对象.SelectSingleNode(节点的名字);

7)查找单个节点的所有子节点:对象.SelectSingleNode(节点的名字).ChildNodes;

<2>XmlNode

1)把其他节点添加到此节点中,作为此节点的子节点:此节点对象.AppendChild(其他节点);

<3>XmlElement

1)创建属性:对象.SetAttribute(属性名字,属性值);

2)创建文本节点:对象.InnerText=文本信息;

<4>XmlNodeList

(2)using System.IO;

类:File(静态类)

<1>File

1)是否存在:File.Exists(路径)

(3)using UnityEditor;

类:AssetDatabase(静态类)

<1>AssetDatabase

1)刷新Unity编辑器界面:AssetDatabase.Refresh();

(4)创建XML:把脚本随便挂载到游戏对象身上,点击运行,点击game窗口,按下A键时,5.xml的目录中多了一个ChatData.xml文件,文件内容如图

(5)添加XML:继续按下B键,右击工程视图,点击Refresh刷新,ChatData中的内容多了一部分

(6)更改XML:继续按下C键,右击菜单刷新,发现红框部分更改了

(7)读取XML:继续按下D键,控制台打印了节点的属性name的值和节点的文本节点

(8)XML数据生成步骤

<1>引进C#的命名空间System.Xml

<2>生成XML文档(XmlDocument类)

<3>生成根元素(XmlElement类)添加给文档对象

<4>循环生成子元素添加给父元素

<5>将生成的XML文档保存

6.SQL

增、改、查、删

(1)SQL编辑器安装

点击SQL安装包,依次默认点击即可


此时,我们的安装目录下就会多出SQL编辑器的软件

(2)新建一个数据库文本

<1>双击SQL编辑器图标打开编辑器,弹出窗口点击ok

<2>创建一个新的数据库

<3>选择文件保存的位置以及保存的文件名称

(3)通过SQL编辑器添加列表以及列名

<1>点击Design,点击左下角的加号

<2>弹出窗口,我们把Table Name(表名)改为user,点击加号添加表中的列,下方的窗口显示的是对应的SQL语句

<3>双击要修改的地方可以修改,Type右边有个下拉菜单可以选择数据类型,上面的修改也会影响下面的SQL语句

<4>在表中添加5个列,分别修改列的值类型,点击创建

<5>此时列表如图

(4)通过SQL语句添加列表以及列名

<1>点击SQL,输入创建列表的SQL语句>>create table "列表名"("列名1" 列值类型1,"列名2" 列值类型2,·····,"列名n" 列值类型n);

<2>点击Execute,左下角显示对号,说明运行成功

<3>引号加与不加无影响

<3>点击Design,多了一个名为guest的table,点击guest,也有添加的列名,对应下面的窗口中的SQL语句跟刚刚写的SQL语句相同

(5)通过SQL编辑器添加值

<1>点击Data,点击user,点击加号

<2>弹出窗口,分别点击每一行的列名在下方的窗口里添加内容,注意内容要与后面的数据类型相匹配,添加完所有列的值(也就是一行的值),这里必须要添加所有的值才能添加,最后点击保存

<3>完成后的界面

(6)通过SQL语句添加值

<1>点击SQL,输入添加值的SQL语句>>insert into "列表名" (列名1,列名2,······,列名n) values(列值1, 列值2,·····, 列值n);

如果不写列名,默认是全部列名

<2>点击Execute执行SQL语句

完成后的界面

(7)通过编辑器修改值

点击要修改的地方,会弹出一个窗口,把里面的值改为你想要的,然后Update修改更新

完成后的界面

(8)通过SQL语句修改值

<1>点击SQL,输入修改值的SQL语句>>update "列表名" set 列名1=值1,列名2=值2,······,列名n=值n  where 条件表达式

<2>点击Execute执行SQL语句

完成后的界面

(9)通过SQL语句筛选值

<1>点击SQL,输入筛选值的SQL语句>>select* from "列表名" where 条件表达式

*代表显示所有满足条件表达式的列值,也可以把*换成其他的列名,意思是显示满足条件表达式的列的列值

<2>下方窗口是筛选显示的值

(10)通过编辑器删除一行数据

<1>选中user,选中一行,点击最下面的减号

弹出的窗口点击Yes
完成后的界面

(11)通过SQL语句删除一行数据>>delete from 列表名 where 条件表达式

完成后的界面
再刷新一下就没了

(12)通过SQL语句删除一个列表>>drop table "列表名"

完成后的界面

总结:

增:insert into "列表名" (列名1,列名2,······,列名n) values(列值1, 列值2,·····, 列值n);

删:delete from 列表名 where 条件表达式

改:update "列表名" set 列名1=值1,列名2=值2,······,列名n=值n  where 条件表达式

查:select* from "列表名" where 条件表达式

(13)简单基本的SQL语句:

(1) 数据记录筛选:

sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]"

sql="select * from 数据表 where 字段名 like '%字段值%' order by 字段名 [desc]"

sql="select top 10 * from 数据表 where 字段名=字段值 order by 字段名 [desc]"

sql="select top 10 * from 数据表 order by 字段名 [desc]"

sql="select * from 数据表 where 字段名 in ('值1','值2','值3')"

sql="select * from 数据表 where 字段名 between 值1 and 值2"

(2) 更新数据记录:

sql="update 数据表 set 字段名=字段值 where 条件表达式"

sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式"

(3) 删除数据记录:

sql="delete from 数据表 where 条件表达式"

sql="delete from 数据表" (将数据表所有记录删除)

(4) 添加数据记录:

sql="insert into 数据表 (字段1,字段2,字段3 …) values (值1,值2,值3 …)"

sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表)

(5) 数据记录统计函数:

AVG(字段名) 得出一个表格栏平均值

COUNT(*;字段名) 对数据行数的统计或对某一栏有值的数据行数统计

MAX(字段名) 取得一个表格栏最大的值

MIN(字段名) 取得一个表格栏最小的值

SUM(字段名) 把数据栏的值相加

引用以上函数的方法:

sql="select sum(字段名) as 别名 from 数据表 where 条件表达式"

set rs=conn.excute(sql)

用 rs("别名") 获取统计的值,其它函数运用同上。

查询去除重复值:select distinct * from table1

(5) 数据表的建立和删除:

CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… )

(6) 单列求和:

SELECT SUM(字段名) FROM 数据表

参考SQL语句大全:https://baike.so.com/doc/3210900-3383815.html

7.SQL的深入

(1)要想在C#中使用数据库,我们需要先做一些准备工作

<1>在Plugins文件夹下添加三个动态库Mono.Data.Sqlite.dll,System.Data.dll,sqlite3.dll

1)先在Assets下新建Plugins(插件文件夹)文件夹。将Unity的安装目录C:\Program Files\Unity\Editor\Data\Mono\lib\mono\2.0

下的Mono.Data.Sqlite.dll,System.Data.dll拷贝至刚才新建的文件夹Plugins 下

2)在电脑中搜索sqlite3.dll,可能会有多个同名文件,我们要那个在Unity目录下的,这个是我们自己设定Unity文件所在的位置,实在不行可以去官网下载 http://www.sqlite.org/download.html

3)右击打开文件所在的位置,将sqlite3.dll拷贝至Plugins 文件夹下。

关于这三个动态库文件,参考文章:http://blog.csdn.net/glunoy/article/details/52037598

<2>修改三个动态库的信息

1)分别选中三个动态库,修改信息,勾选Any Platforms(任意平台),unity设定中CPU选择Any CPU,OS选择Any OS

2)下载平台全部勾选

3)最后点击Apply应用,这样我们就可以在C#中使用数据库了

(2)引入要添加的数据库文件

(3)创建脚本文件

<1>命名空间:using Mono.Data.Sqlite;

类:SqliteConnection、SqliteCommand、SqliteDataReader

1)SqliteConnection

1.1)创建一个与数据库链接的链接对象:SqliteConnection(数据库路径);

1.2)打开数据库:对象.Open();

1.3)创建数据库命令:对象.CreateCommand();

1.4)关闭数据库链接:对象.Close();

1.5)销毁数据库链接:对象.Dispose();

2)SqliteCommand

2.1)输入命令文本:对象.CommandText=信息;

2.2)执行SQL语句方法一:

受到影响的的行数,此方法只能用来增删改:对象.ExecuteNonQuery();

2.3)执行SQL语句方法二:

当有多个查询结果,只返回第一行第一列的值,此方法在查询结果只有一个的时候使用,对象.ExecuteScalar();

2.4)执行SQL语句方法三:

可以返回多个或所有信息,对象.ExecuteReader();

3)SqliteDataReader

3.1)当前行是否有可读信息:对象.Read();

3.2)可读的行数:对象.FieldCount;

<2>命名空间:using UnityEngine;

类:Application

1)Application

1.1)找到要链接的数据库所在的目录:"Data Source="+Application.streamingAssetsPath+"StreamingAssets目录下的目录"

8.WWW

(1)简单使用WWW类

<1>代码贴图:

<2>WWW类:

1)创建一个链接路径的WWW对象:WWW(本地链接或者时网络链接);

本地链接:需要在路径前面加file://

网络链接:服务器链接

2)错误:对象.error

3)是否在做:对象.isDone

4)图片信息:对象.texture

5)卸载:对象.Dispose();

<2>IEnumerator协程

等待对象完成操作:yield return 一个对象;


最后:这里不奇怪了,按理说数据库什么应该时挺多的,但我们这里是针对游戏开发,而在游戏开发中需要的并不多,基本操作即可。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容