最近在学习Unity,找了个视频学习我的世界的复现,途中遇到了一些问题,记录下来,万一以后遇到了类似的问题,就可以解决了。
视频链接:http://www.sikiedu.com/course/36/task/1168/show
0X01
大概unityhub准备进入项目的时候发现提示我编辑器不存在(明明是有的),于是在unityhub中下载编辑器,但是需要登录,登录界面一直白屏,登录不上。我于是将之前的东西全部删掉。我于是重新在官网下载untiyhub和编辑器(项目里没有什么东西),之后发现又出现了这种情况
解决办法
我自己找了一个土方法,我发现我的unity是开机启动的,如果开机的时候没有网络,就不会自动登录上unityhub,而且会弹出警告,于是我赶在电脑自动弹出untiy之前,提前登录校园网(笑),之后就没有这种情况了。太机智了。
0X02
视频中提到创建一个第一人称的摄像机,但是我的版本是2020之后的,他的版本比我低好多,我并没有那个选项。
解决办法
unity商城里面有,就是那个standard assects.安装之后会出现一个这个名字的文件,我们所需要的就在里面
0X03
安装完上一个那个standard assects之后,出现了这种问题(笑)
解决办法
https://blog.csdn.net/zhang2333333333/article/details/105000621
看新问题,那里就行,问题一下子就被解决了
0X04
无法给物体添加脚本
当我想打开脚本时出现了这种情况
解决方案
我首先解决了打不开的问题
电脑默认的js编辑器是Microsoft JScript,所以我下载了一个notepad+(也是个编辑器)
然后修改了js文件的默认打开编辑器
设置,然后找到应用
按文件类型指定默认应用
找到js,修改,于是我就可以在unity中打开脚本了(笑)
在一顿搜索中,我发现了原因,原来是Unity弃用了JS,所以我的JS脚本无法使用了(好耶)
我找到了一个新的C#脚本,(可喜可贺),
最后的脚本是
using System.Collections;using System.Collections.Generic;using UnityEngine;public class MapTexture : MonoBehaviour{ // Start is called before the first frame update void Start() { Map(); }// Update is called once per framevoid Update(){ }void Map(){ MeshFilter filter = GetComponent(); Mesh mesh = filter.mesh; if (filter != null) mesh = filter.mesh; if (mesh == null || mesh.uv.Length != 24) { Debug.Log("Attach To Cube"); return; } var uvs = mesh.uv; //Z轴正向侧(背面) uvs[0] = new Vector2(0.0f, 0.0f); uvs[1] = new Vector2(0.333f, 0.0f); uvs[2] = new Vector2(0.0f, 0.333f); uvs[3] = new Vector2(0.333f, 0.333f); //顶面 uvs[8] = new Vector2(0.334f, 0.0f); uvs[9] = new Vector2(0.666f, 0.0f); uvs[4] = new Vector2(0.334f, 0.333f); uvs[5] = new Vector2(0.666f, 0.333f); //Z轴负向侧(正面) uvs[10] = new Vector2(0.667f, 0.0f); uvs[11] = new Vector2(1.0f, 0.0f); uvs[6] = new Vector2(0.667f, 0.333f); uvs[7] = new Vector2(1.0f, 0.333f); //底面 uvs[12] = new Vector2(0.0f, 0.334f); uvs[13] = new Vector2(0.0f, 0.666f); uvs[15] = new Vector2(0.333f, 0.334f); uvs[14] = new Vector2(0.333f, 0.666f); //左面 uvs[16] = new Vector2(0.334f, 0.334f); uvs[18] = new Vector2(0.666f, 0.666f); uvs[19] = new Vector2(0.666f, 0.334f); uvs[17] = new Vector2(0.334f, 0.666f); //右面 uvs[20] = new Vector2(0.667f, 0.334f); uvs[22] = new Vector2(1.00f, 0.666f); uvs[23] = new Vector2(1.00f, 0.334f); uvs[21] = new Vector2(0.667f, 0.666f); mesh.uv = uvs;}}
所以这个问题就被完美解决掉了
0X05
关于添加光标那个视频中的修改代码我并未找到相应部分,猜测是两个版本有所差别,
解决方案
原来最新的脚本里根本就没有这个功能
所以我就重新弄了个脚本打算试试行不行
using System.Collections;using System.Collections.Generic;using UnityEngine;public class NewBehaviourScript : MonoBehaviour{ // Start is called before the first frame update void Start() {}// Update is called once per framevoid Update(){ /* if(Input.GetKeyDwon(keyCode.P)) { Cursor.visible = false; } if(Input.GetKeyDown(KeyCode.O)) { Cursor.visible = true; }*/}}
但是我又发现另一个问题(头疼),我的unity里无法识别Input这个类,那么问题来了,下载的脚本里没有input这个函数,那么它是怎么判断我的键盘呢?
识别input这个类的方法是将外部脚本编辑器改为自己的编辑器即可(详见https://jingyan.baidu.com/article/49ad8bce4ffc4e5835d8fa49.html)
然后发现上面的代码没有什么卵用。
直接在update类下面添加一句Cursor.visible = true;
即可。
不过光标会不断闪烁,有点难截取到,所以没有图片
现在有两个问题,一个是解决掉光标不断闪烁的问题,第二个问题是这个光标太难看了,我想在游戏中换一个光标,就像我的世界游玩过程中那种。
解决光标图案:
代码:
using System.Collections;using System.Collections.Generic;using UnityEngine;public class ChangeCursor : MonoBehaviour{ public Texture2D cursorTexture; // Start is called before the first frame update void Start() {}// Update is called once per framevoid Update(){ Cursor.SetCursor(cursorTexture, Vector2.zero, CursorMode.Auto);}void OnMouseEnter(){ Cursor.SetCursor(cursorTexture, Vector2.zero, CursorMode.Auto);}void OnMouseExit(){ Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);}}
然后将代码贴到Camera中即可
随后将自己想要的图片贴入
Cursor Texture中
0X06
光照系统问题
光照系统并不是靠移动Directional Light 来实现的,而是通过平行光所照射的位置来决定的。就是点击键盘上的'r'键即可进行调整
0X07
我的世界中一天的时间是20分钟,光照旋转一圈是360度,所以要一秒0.3度,但是出现了这种情况,报错了
于是我换成double类型
也不行,
解决方案
float类型,但是0.3后面添加一个'f'(吐血)
新状况:
日月转换程度有点太快了,所以我打印了一下rotatespeed,发现打印出来是10
解决方案:
检视面板中也需要修改
做完了,这个复现