1.脚本简介
1.1生命周期及常用函数
2.改变物体位置
改变物体位置实际上是修改物体transform组件的position的值
2.1改变位置的方法
一种是使用translate()函数,逐渐改变,放在update()中
transform.Translate(x,y,z);//x,y,z表示自身的方向,x正方向表示自身的右方向
transform.Translate(1,0,0);//表示沿着右方向移动1个单位
transform.position += new Vector3(1,0,0);//等价于上一行代码
(注:Translate()和修改position的本质区别:Translate()函数默认的是局部坐标系,而修改position的方法是世界坐标系)
另一种是直接指定新的位置
transform.position=new Vector3(1.5f,0,0);
(注:1.5要写成1.5f形式,这是由于c#的语法规定,不带后缀的会自动默认为double类型,这里需要的是float类型;
为什么要加new,是因为position是一个属性,而Vector是一个值类型,且不能写成transform.position.x=1.5f的形式)
由于无法保证稳定的帧率,若要实现每秒移动相同的距离,则要用上Time.deltaTime,它表示两帧之间的间隔。
transform.Translate(1*Time.deltaTime,0,0);
transform.position += new Vector3(1*Time.deltaTime,0,0);
Time.timeScale=0;//表示游戏里时间停滞,等于1为正常流逝,等于2为两倍流逝
3.读取和处理输出
3.1获取偏移量
如读取键盘上的WASD值,用户输入在纵轴和横轴的偏移量
void Update()
{
float v = Input.GetAxis("Vertical");//获取纵轴偏移量,取值范围-1~1
float h = Input.GetAxis("Horizontal");//横轴
Debug.Log("纵轴偏移量为:"+v+" "+"横轴偏移量为:"+h);//打印
}
3.2控制移动
通过简单的乘法就可以将输入的幅度和物体运动联系起来
void Update()
{
float v = Input.GetAxis("Vertical");
float h = Input.GetAxis("Horizontal");
transform.Translate(h*10*Time.deltaTime,0,v*10*Time,deltTime);//10是速度
}
4.触发器
Collider组件中勾选Is Trigger就可实现触发器功能,并不是所有物体进入触发范围
4.1产生触发事件的条件:
后续补充
4.2触发器事件函数:
开始触发(OnTriggerEnter):进入触发范围
触发持续中(OnTriggerStay):在触发范围内
结束触发(OnTriggerExit):离开触发范围
5.案例:控制小球吃金币
5.1控制小球脚本
private float v,h;
private float speed=10f;
private void Update()
{
v = Input.GetAxis("Vertical");
h = Input.GetAxis("Horizontal");
transform.Translate(h*speed*Time.deltaTime,0,v*speed*Time.deltaTime);
}
5.2金币触发脚本
private void OnTriggerEnter()
{
Destroy(gameObject);
}
(注:多余空的Star()和Update()函数请删除,避免CPU资源消耗)
补充:
头部引入UnityEngine.SceneManagement,就可使用切换场景方法
SceneManager.LoadScene(0);//0表示场景序号
gameObject.SetActive(false);//场景中隐藏这个物体
Quaternion.Slerp (Quaternion a, Quaternion b, float t);
//这可用于创建一个旋转,以基于参数的值 a,在第一个四元数 a 到第二个四元数 b 之间平滑进行插值。
gameObject.tag=="Cube"等价于gameObject.CompareTag("Cube");推荐使用CompareTag
6.通过父子路径获取物体
如果要引用上一级节点,使用两个英文句号“..”即可。
Transform p1 = transform.parent;
Transform p2 = transform.Find("..");//p1与p2相同
7.实现预制体
使用Instantiate()方法对预制体实例化
8.定时创建和销毁物体
8.1定时创建
Invoke(" ",t);//延迟执行,第一个参数是以字符串表示的方法名称,第2个参数表示延迟时间,单位为秒
//写一个创建物体的方法放入Invoke()中
8.2销毁物体
Destroy(gameObject);//在合适时机销毁物体
Destroy(gameObject,0.8f);//延迟销毁
DestroyImmediate(gameObject);//立即销毁物体
9.相机跟随
创建脚本挂在相机上
public Transform followTarget;//跟随的目标
Vector3 offset;
void Start()//场景中需要设置好目标和相机的位置
{
offset=transform.position-followTarget.position;//算出从目标到相机的向量,作为相机的偏移量
}
void LateUpdate()
{
transform.position=followTarget.position+offset;//
}
10.协程入门
协程代替大量使用Invoke()
void Start()
{
StarCoroutine(Timer());//开启协程,协程函数为Timer()
}
IEnumerator Timer()//协程函数
{
while(true)//不断循环执行,但不会导致死循环
{
Debug.Log("测试协程");//打印
yield return new WaitForSeconds(1);//等待1秒
Debug.Log(Time.time);//打印当前游戏经历的时间
yield return new WaitForSeconds(1);//等待1秒
}
}