Linux下执行shell脚本,提示 语法错误: 未预期的文件结尾
背景
windows下编写了shell脚本,上传到centos下执行,提示如下错误:
install.sh:行16: 语法错误: 未预期的文件结尾
原因
文本编码问题,windows下大部分编辑器,默认的换行为:\r\n
。而到了centOS
下shell脚本会识别为错误的结尾。
解决
重新编辑,将\r\n
替换为\n
即可解决。
windows下编写了shell脚本,上传到centos下执行,提示如下错误:
install.sh:行16: 语法错误: 未预期的文件结尾
文本编码问题,windows下大部分编辑器,默认的换行为:\r\n
。而到了centOS
下shell脚本会识别为错误的结尾。
重新编辑,将\r\n
替换为\n
即可解决。
Time.deltaTime
表示执行的时间间隔,放在Update中,可查看每帧更新的时间间隔Application.targetFrameRate=50
,配置FPS帧率this
表示当前组件。如:this.transform.Translate(0,0.5f,0);表示将当前游戏对象Y方向上移动0.5个Unit;
f1oat step = 0.8f *Time. de1taTime;
this.transform.Trans1ate(o,step,0);
this
获取当前组件this.gameObject
获取当前节点(游戏对象)this.gameObject.GetComponent<组件类型>();
this.GetComponent<组件类型>();
GetComponent<组件类型>();
在当前节点中获取其他节点,使用GameObject.Find
。
//获取其他节点
GameObject obj = GameObject.Find("/Other/22");//获取节点,通过名字或路径查找
SpriteRenderer comp = obj.GetComponent<SpriteRenderer>();//获取节点下组件
comp.flipY = true;//修改组件属性
//获取父级节点
GameObject parent = this.transform.parent.gameObject;
//获取所有子节点可直接遍历transform
foreach(var child in transform)
{
//...
}
//将A节点移动到B节点下
GameObject objA= GameObject.Find("节点A的名称");
GameObject objB= GameObject.Find("节点B的名称");
objA.transform.SetParent(objB.tansform);
//转移到场景根节点下,可将parent设置为null
objA.transform.SetParent(null);
脚本中,直接添加全局Public
属性,会自动转换为组件的属性,在Unity设计页面的Inspector窗口中可直接看到并修改。
支持的类型:
三维向量,用于移动、旋转等操作。
//指定坐标位置
transform.position= new Vector3(1,1,1);
//通过设置欧拉角的值,逆时针旋转45度。也可以通过Rotation设置,但不使用Vector3
transform.eulerAngles= new Vector3(0,0,45f);
本地坐标对应的属性:localEulerAngles、localPosition等。
以下代码表示沿着自己的方向运动
void Update()
{
transform.Translate(0,0.2f,0,Space.Self);
}
常用运算:
常用的使用场景:
求两个物体间的距离:
GameObject obj1 = GameObject.Find("obj1");
GameObject obj2 = GameObject.Find("obj2");
Vector3 v1 = obj1.transform.position;
Vector3 v2 = obj2.transform.position;
Vector3 direction = v2-v1;
Debug.Log("obj1和obj2之间的距离为:" + direction.magnitude);
使用SignedAngle方法进行计算。
Vector3 a = new Vector3(2,2,0);
Vector3 b = new Vector3(-1,3,0);
float angle = Vector3.SignedAngle(b, a, Vector3.forward);//会有正负号
Debug.Log ("夹角为:" + angle) ;
//打印内容:夹角为:63.43495
注意:Vector3.SignedAngle返回的角度有正负号,有顺时针和逆时针区别。Vector3.Angle方法可返回没有方向(正负)的角度。
转向,将物体A转向物体B
GameObject objA = GameObject.Find("objA");
GameObject objB = GameObject.Find("objB");
Vector3 v1 = objA.transform.position;
Vector3 v2 = objB.transform.position;
Vector3 direction = v2 - v1;
float angle = Vector3.SignedAngle(objA.transform.up, direction, Vector3.forward);
objA.transform.Rotate(0, 0, angle);
获取一个物体的屏幕坐标
Vector3 pos = transform.position;
Vector3 screenPos = Camera.main.WorldToScreenPoint(pos);
判断一个物体是否超出屏幕,使用屏幕坐标判断
Vector3 sp = Camera.main.WorldToScreenPoint(transform.position);
if(sp.x>Screen.width)
{
//超出屏幕右边界
}
if(sp.x<0)
{
//超出屏幕左边界
}
Unity中,高度是固定的,不同屏幕分辨率下,只是宽度不同。所以Y方向是否超出边界可以直接使用物体的游戏坐标去判断,而X轴方向是否超出边界需要使用屏幕坐标判断。
在Update()中,探测鼠标事件
if(Input.GetMouseButtonDown(0))
{
//鼠标左键按下
}
if(Input.GetMouseButtonUp(0))
{
//鼠标左键抬起
}
if(Input.GetMouseButton(0))
{
//检查鼠标左键是否按下
}
Input.mousePosition
代表此时鼠标的位置(屏幕坐标)Input
获取GetMouseButtonDown
和GetMouseButtonUp
只能在Update中调用。GetMouseButtonDown
和GetMouseButtonUp
代表事件,所以即使一直按着鼠标不松开,也只会被监测出一次按下。而GetMouseButton为获取鼠标状态,所以每次执行Update都会触发一次。Input.GetKeyDown(key)
:键盘按下事件Input.GetKeyUp(key)
:键盘抬起事件Input.GetKey(key)
:查看状态,某键是否被按下Unity内置枚举KeyCode
来表示键盘的按键。
if(Input.GetKeyDown(KeyCode.LeftArrow))
{
//向左的方向键被按下
}
可通过设置进行修改。具体设置在:Edit-Project Settings-Script Execution Order
值越小,越先执行。
直接在脚本中添加Public的属性即可。
通过预制体动态创建物体。
GameObject bullet = Instantiate(myPrefab);
点击鼠标发射子弹的实现:
//定义一个属性,用来存放预制体
public GameObject myPrefab;
// 在Unity界面中,将该属性设置为一个预制体。
void Update()
{
if(Input.GetMouseButtonDown(0))
{
//通过预制体创建实例
GameObject bullet = Instantiate(myPrefab);
}
}
GameObject.Destroy(obj);
注意,销毁的是游戏对象,不要写成销毁当前组件。
Destroy(this.gameObject);//正确
Destroy(this);//错误
通过对物体添加刚体组件可将该物体设置为刚体。
刚体的类型:
通过对物体添加碰撞体组件可将该物体设置为碰撞体。
两个碰撞体相遇会产生碰撞。
通过碰撞体组件属性中的 Edit Collider,可以修改碰撞体的碰撞范围
碰撞体的类型:
最近项目使用到了Unity WebGL。在加载资源包时,提示了内存不足问题。Unity版本:5.6.3
后在Player Settings中进行配置,修改了WebGL Memory Size
的值,但在修改后出现了如下错误:
unity WebAssembly.instantiate(): memory import has a larger maximum size
WebAssembly.instantiate(): memory import 419 is smaller than maximum 9600
多次排查后,发现这个值不能随意设置,推荐使用64、128、256、512等这类整数
值。
知道了问题,自然好处理了,根据自己的需要,设置为512后,问题解决。
使用Dapper查询数据时,执行到以下代码是,提示错误。
await DbConnection.QueryAsync<MyDto>(sql);
错误信息为:
Error parsing column 0 (NAME=39fb9af0-7a6f-7b2a-26d6-4fe92a2798fc - Object)
System.Data.DataException: Error parsing column 0 (NAME=39fb9af0-7a6f-7b2a-26d6-4fe92a2798fc - Object)
---> System.InvalidCastException: Object must implement IConvertible.
但是调试拿到了sql语句,去Navicat下执行,完全没有问题。起初,百度找到了这篇文章,但发现我的问题并非文章中的原因造成的。
该查询中,只查询了两个字段,其中一个为Char(36)类型,通过Dapper查询后转换为了string,本来char转换为string再正常不过。直到后来查询资料发现,Mysql中对Char(36)默认为Guid,但也就是说,你配置了字段类型为Char(36),它代表的意义就已经不是字符串了,转换需要单独处理。
知道问题原因了,就好办了。只需要在查询是将其转换为字符串即可,或者设置转换的类型为Guid。
SELECT CAST(Uid AS CHAR) Name ...
或修改MyDto中的字段类型
...
public Guid Name { get; set; }
...
timedatectl
timedatectl list-timezones
timedatectl set-timezone Asia/Shanghai
dnf install -y chrony
chrony配置文件: /etc/chrony.conf
如果服务器在国内,建议修改时钟服务器为国内服务器。其他地区时钟服务器可参考:https://dns.icoa.cn/ntp/
将第一行改成: pool ntp.ntsc.ac.cn iburst
systemctl enable chronyd
systemctl start chronyd