unity如何给csv文本新增行数据信息

unity如何给csv文本新增行数据信息,第1张

import csv

# 1.1返回文件对象

message = open('./test/北京高档酒店价格分析.csv', 'r', encoding='utf-8')

# 1.2创建读文件方法

message_1 = csv.reader(message)

# 将数据类型变成有序列表

data = list(message_1)

message.close() # 关闭文件

# print(data)

# 创建新文件

f2 = open('./test/北京酒店价格分析.csv', 'w', encoding='utf-8', newline='')

# 写--方法

mywrite = csv.writer(f2)

# 获取csv文件中第一个数据

data1 = [i for i in data[0]]

data1.append('平均评分')

mywrite.writerow((data1))

# 查看数据

for i in data[1:]:

# print(i)

avg = round((float(i[3]) + float(i[4]) + float(i[5]) + float(i[6])) / 4, 2)

result = f'{i[0]}的平均分为:{avg}'

# print(result)

# 将平均分重新写入文件

i.append(avg)

mywrite.writerow(i)

f2.close()

感觉你的问题应该有更直接的办法,一是不太懂你的意思,比如你具体是要实现怎样的功能?为什么要根据XY计算,难道同样的装备随机次数不同,power计算也不同? 第一、第二个装备又是什么意思?理论上应该限定总的可装备上限,比如一共就可以装备三个东西,那么你自然需要定义一个三个元素的数组了。如果每个装备名称对应的xy是固定的话,计算power似乎没意义了,还不如把power参数和装备写在一起,而你只要随机xy来取不同装备就行了吧。

以下顺带讲一下写入数据的办法。

(不好意思我用的是JS,语法上转换一下就行了。)

不用playerprefs的方法是:

新建一个类,这个类里面定义你要储存在磁盘上的变量,最后把这个类写成*.dat文件(binary文件),这样这个类里的数据就写在磁盘上了,以后你就可以随时调取、更新所存储的数据了。

(1)编程时你要用到几个基本的包:

import System;

import System.Runtime.Serialization.Formatters.Binary//用来写binary文件

import System.IO//基本的输入输出

详细的你还可以去查.net 的MSDN 参考。

(2)你要自定义一个类用来规定数据,比如:

Class GameData {

var itemID:int

var power:float

}

(3)你还需要一个实例化的脚本(比如命名成,GameDataManager ),把这个脚本放在一个场景中GameObject上就可以了,这个脚本用来实际 *** 作读取和写入。把这个类做成一个Singleton,就是说仅在整个游戏刚启动时初始化一个静态的实例,而且在此后的场景退出时都不要清除,这样可以避免反复覆盖读取和存储数据的风险。比如:

static var instance:GameDataManager

Awake() {

if(instance == null){ //当前场景中没有其他实例化的脚本,

DontDestroyOnLoad(gameObject)//那么说现在本脚本是唯一的实例,所以不要销毁

instance = this//把唯一的静态指针指向自己。

}else if(instance != this){

Destroy(gameObject)//当前场景中已经有了其它实例!说本脚本是重复的实例,销毁!

}

}

(4)接下来要判断是否已经存在先前的存档binary文件,如果没有,就需要初始化一个GameData类。

var myGameData:GameData

function Start () {

myGameData= Load()//此处Load()是脚本后面定义的一个读取binary文件.Dat的方法

if(myGameData== null){ // 如果没有读取到文件,就初始化一个新的数据类

myGameData= new GameData()

myGameData.power= 999// 数据初始化,这里你可以自定义更复杂的方法或算法

Save()//写入数据,此处Save()也是后面定义的一个存储binary文件.Dat的方法

}

}

(5)具体完成Load() 和 Save()方法:

function Save (){

var bFile:BinaryFormatter

var file:FileStream

bFile = new BinaryFormatter()

file = File.Create(Application.persistentDataPath + "/GameData.dat")//在系统默认应用程序路径创建.Dat文件

bFile.Serialize(file, currentGameData)// 写入数据

file.Close()//完成文件

}

function Load ():GameData{

var bFile:BinaryFormatter

var file:FileStream

var loadData:GameData

if(File.Exists(Application.persistentDataPath + "/GameData.dat")){//判断.dat文件是否存在

bFile = new BinaryFormatter()

file = File.Open(Application.persistentDataPath +"/GameData.dat", FileMode.Open)//打开系统默认路径中的.Dat文件

loadData = bFile.Deserialize(file) as GameData//获取读取到的数据

file.Close()//关闭文件

}

return loadData//返回获取到的数据类

}

最后,如果你英文过的去,unity的官方网站上有全套视频,其中一个章节就是讲解如何存储数据的!不过前提是你得会 夫安 七一昂,否则视频可能看不了。今年封的更严了,国情你懂的,

优点:

1.unity内置的一种储存容器(不用作为组件挂载在物体上,也可以被序列化)

2.可以以asset形式储存(不需要其他额外的文件解析转换之类的,同时可跨项目使用)

3.可以在PlayMode储存数据更改(再也不怕更改数据没保存了)

4.可以储存大量数据(其他对象都可以调用,有效避免产生冗余数据,这一点太有用了)

5.可以添加引用到脚本中

缺点:

1.需要扩展Editor

2.不可以在unity外 *** 作

3.这是用来储存开发数据的,而不是储存玩家数据的。

什么时候用?

1.就如优点所展示的那样,当有一些数据被同时大量使用,为了避免数据冗余,可以使用。同时应该注意,因物而异的变量不应该声明在此处。

2.作为唯一的资源交给版本控制器。例如,本地化数据、清单目录、表格、敌人配置等

3.ScriptableObject除了可以存储数据外,我们还可以在ScriptableObject中定义一些方法。。这类似于插槽设计模式,ScriptableObject提供一些槽,MonoBehaviour可以把自己插进去。适用于AI类型、回血的buff或debuffs等(回血例子见结尾)

如何实现?

step1.创建你用于共享数据的类(例如EnemyData)

step2.新建一个脚本扩展Editor,使编辑器能够创建自定义的ScriptableObject对象

step3. 在需要引用的脚本中引用

另外注意:每次新建项名称都相同,这意味着不及时改名就会被覆盖。请及时归类或重命名

到第三步为止,是 ScriptableObject最基础的用法,或许它的优点还不明显,接下来再举例第四步

further step. 创建区域化控制脚本(可以是GameManager这种)

回血buff例子


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11646857.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-17
下一篇2023-05-17

发表评论

登录后才能评论

评论列表(0条)

    保存