参考文章:
http://www.jianshu.com/p/6e4b0435e30e
Update,FixedUpdate,LateUpdate的区别
- 处理Rigidbody时,需要用FixedUpdate代替Update。例如:给刚体加一个作用力时,你必须应用作用力在FixedUpdate里的固定帧,而不是Update中的帧。(两者帧长不同)。 Update跟当前平台的帧数有关,而FixedUpdate是真实时间,所以处理物理逻辑的时候要把代码放在FixedUpdate而不是Update。Update是在每次渲染新的一帧的时候才会调用,也就是说,这个函数的更新频率和设备的性能有关以及被渲染的物体(可以认为是三角形的数量)。在性能好的机器上可能fps 30,差的可能小些。这会导致同一个游戏在不同的机器上效果不一致,有的快有的慢。因为Update的执行间隔不一样了。
- LateUpdate是在所有Update函数调用后被调用。这可用于调整脚本执行顺序。例如:当物体在Update里移动时,跟随物体的相机可以在LateUpdate里实现。
编写脚本
- Player为玩家,设置为刚体RigidBody,为其编写的脚本如下:
//PlayerController.cs
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class PlayerController : MonoBehaviour {
public float speed; //球的速度
//public Text countText;
// private int count;
// Use this for initialization
void Start () {
count = 0;
}
// Update is called once per frame
void Update () {
//Debug.Log("123456");
}
void setCountText()
{
countText.text = "Count : "+count;
}
void FixedUpdate()
{
float moveHorizontal = Input.GetAxis("Horizontal");
float movevertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(moveHorizontal, 0.0f, movevertical);
GetComponent<Rigidbody>().AddForce(movement * speed * Time.deltaTime);
setCountText();
}
//碰撞时触发,传参其他碰撞体
void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "PickUp")
{
other.gameObject.SetActive(false);
//count++;
}
}
}
- Main Camera玩家视角,为其编写脚本,与Player球体同步,如下:
//CameraController.cs
using UnityEngine;
using System.Collections;
public class CameraController : MonoBehaviour {
public GameObject player;
private Vector3 offset;
// Use this for initialization
void Start () {
offset = transform.position; //得到初始时相机对于球体的偏移量
}
void LateUpdate()
{
transform.position = player.transform.position + offset;//球体位置加初始偏移量,相对位置不变
}
}
- PickUp方块为物体,即当玩家球体与其相碰时显示,设置其自动旋转,脚本如下:
还需要将PickUp的BoxCollider中的 is Trigger勾选,否则不会触发OnTriggerEnter方法。
//Rotator.cs
using UnityEngine;
using System.Collections;
public class Rotator : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
transform.Rotate(new Vector3(15, 30, 45) * Time.deltaTime);
}
}
- 发布游戏,可以发布到多平台。