最近给女票做毕设,有几个比较有意思的开发方法,记录一下。
1.2D模式下的物体分类
开发方法:通过UGUI按钮的点击事件进行数值处理,通过tag判定是否为一个类型。
2.带参跳转问题
带参跳转问题属于之前从来没结束过的一个新问题。
问题描述:在场景1向场景2跳转,在完成场景2的任务之后,要回到场景1,要求场景1中人物的位置与跳转之前相同。若是像之前使用ScenceManager的话,重新进入场景一时,人物位置就会初始化。
解决方法:使用PlayerPrefs类,在离开场景1时,对人物的位置position.xyz进行拆分存储,在从场景2跳转至场景1时,对场景1的人物位置进行赋值。
(1)解析PlayerPrefs
PlayerPrefs是Unity内置的一个静态类,可以用于存储一些简单的数据类型:int ,string ,float。可以用它来做成计分板这类需要可持续化存储的小地方。
PlayerPrefs数据存储在哪里?
1.在Mac OS X上存储在~/Library/PlayerPrefs文件夹,名为unity.[company name].[product name].plist,这里company和product名是在project Setting中设置的
2.在windows下,playerPrefs被存储在注册的HKCU\Software[company name][product name]键下,这里company和product名是在project setting中设置的。
3.在Android上,数据存储(持久化)在设备上。数据保存在SharedPreferences中。
PlayerPrefs有哪些方法?
分为五类:SetXXX , GetXXX , DeleteXXX, HasKey , Save.
传送门:https://docs.unity3d.com/ScriptReference/PlayerPrefs.html
1.SetXXX : 是你要储存的数据类型,这里必须是一组键值对,第一个参数是Key,第二个参数是对应的Value。
2.GetXXX:这里是获取数据的函数,只有一个参数Key,用来获取对应Key的Value.
3.HasKey: 这个可以用来做判断。比如有两组数据一组有XX这个Key,另一组没有XX这个Key,这个时候我们就可以对这两组数据进行差异化操作。
4.DeleteXX:用于删除数据。
5.Save:用于在突发退出程序时,保存数据以备恢复时使用,但是会导致程序间断所以不建议调用。
所以,我理解的playerPrefs的功能类似于xml文件,可以用来存储值,并且这些值不会随着场景跳转而消失。
(2)具体解决过程
写了两个函数
void LoadPos()
{
float x = PlayerPrefs.GetFloat("ren_x");
float y = PlayerPrefs.GetFloat("ren_y");
float z = PlayerPrefs.GetFloat("ren_z");
renwu.GetComponent<Transform>().localPosition = new Vector3(x, y, z);
PlayerPrefs.SetInt("count", 0);
}
void record_position()
{
PlayerPrefs.SetFloat("ren_x", renwu.GetComponent<Transform>().position.x);
PlayerPrefs.SetFloat("ren_y", renwu.GetComponent<Transform>().position.y);
PlayerPrefs.SetFloat("ren_z", renwu.GetComponent<Transform>().position.z);
}
loadPos用来给人物的位置赋值,record_position用来记录人物位置,将位置xyz拆成三个值,分别记录在ren_x,ren_y,ren_z中。在从场景1跳转至场景2的时候,执行LoadPos(),记录人物位置。在从场景2跳转到场景1的时候,再利用一个值。PlayerPrefs.SetInt(“count”, 1);,将count设为1.在场景1的脚本加载时,判断count值是否为1,若为1,则证明是从场景2跳转过去的,执行loadPOS
在执行完loadPos之后,需将count变换一个值,否则人物位置就一直是记录位置了
**
3.3D拖拽问题
与2D拖拽相同,也是使用tag进行辨别是否是一个类别,但是实现的方式为,在每个类别区域中间放置一个物体作为标志物,计算目标物体与标志物之间的距离,若小于一个值,则证明我将该目标物体放在某标志物之下。其中用了三个东西,记录一下
(1)计算物体与物体之间距离的一个函数Distance(gameobject1,gameobject2),返回的值是一个float值
(2)3D物体的拖拽已经系统写好,是DragRigidbody,可以直接拿来用,但是有个问题就是在拖拽过程中,物体会进行旋转
(3)为了解决上述的旋转问题,需要通过rigidbody的属性进行锁定。
rigidbody1.constraints = RigidbodyConstraints.FreezePosition;
即可以使得物体的position进行锁定
rigidbody1.constraints = RigidbodyConstraints.FreezeRotation;
可以使得物体的旋转进行锁定