(6) 设置角色与场景间位移
取消勾选Apply Root Motion。勾上apply root motion对象的Transfrom变动会基于动画移动,不受脚本控制。 勾掉则Transform受到脚本控制。
3.设置摄像机(1)跟随player移动
将main camera 设置为unitychan的子对象,则可以跟随player的移动而移动。
(2)第三人称视角。
设置相机的位置,使其位于player的背后
(3)设置camera
最终效果:
4.随机创建食物在plane上随机位置随机时间间隔生成一个cube,如果没有被触发则在15s后销毁。
(1) 创建prefab
我们会在游戏中产生许多属性相同的小Cube作为食物,如果要控制每一个食物随机间隔时间出现,通过将其设为预制体可以减轻很多工作量。比如,给预制体添加一个脚本,则由预制体而来的游戏对象都有该脚本。
(2) 贴图
创建一个 Cube Material,赋给food
(3) 设置旋转
给预制体food添加脚本CubeRotate控制立方体的旋转。
选用transform.Rotate函数
【function Rotate (axis :Vector3, angle : float, relativeTo : Space = Space.Self) : void】
transform.Rotate(new Vector3(0f, 1f, 1f));
(4) 随机出现
通过脚本设置食物在plane中随机时间,随机位置产生。并且在15s没有被吃时销毁。
A.新建一个空的GameObject,添加脚本FoodControl
代码如下:
void Start () {float groundwidth=ground.GetComponent().bounds.extents.x;float foodwidth = myfood.GetComponent().bounds.extents.x;maxWidth = groundwidth - foodwidth;// Vector3 screnpos = new Vector3(Screen.width, 0, 0);// Vector3 moveWidth = Camera.main.ScreenToWorldPoint(screnpos);//食物自身宽度//maxWidth = moveWidth.x - foodwidth;}// Update is called once per framevoid Update () {time -= Time.deltaTime;if (time < 0){//产生一个随机数,代表实例化下一个food所需要的时间time = Random.Range(1.5f, 2.0f);//产生随机数Posx,PosY,代表实例化food的坐标float posX = Random.Range(-maxWidth, maxWidth);float posY = Random.Range(-maxWidth, maxWidth);Vector3 spawnPositon = new Vector3(posX, 2f, posY);//实例化food,15秒后销毁newmyfood = (GameObject)Instantiate(myfood, spawnPositon, Quaternion.identity);Destroy(newmyfood, 15);}}
B.设置参数
运行效果:
5.设置碰撞(1)为player添加Box Collider组件,编辑范围
(2) 碰撞检测
A.在MonoBehaviour类中,OnCollisionEnter、OnCollisionExit和OnCollisionStay是碰撞时的回调方法,可以在脚本中重载它们。当绑定了Collision脚本组件的游戏物体发生碰撞时,OnCollisionEnter便会被触发调用一次。然后,在整个碰撞过程中会持续调用OnCollisionStay方法,直到碰撞接触被解除时,OnCollisionExit被触发一次。这三个方法都有一个Collision类型的参数,用于保存碰撞信息。
撞检测/*void OnCollisionEnter(Collision collision){//获取碰撞到的游戏物体上的Collider// string name = collision.collider.name;// print(name);if (collision.collider.tag == "food"){Destroy(collision.collider.gameObject);}}*/
B.添加脚本后,给player的RigidBody设置Constraints
(3)触发检测
使用碰撞检测,发生碰撞的游戏物体之间会有碰撞模拟,例如撞到东西会反弹或者停顿一下。如果只想要检测物体与物体之间是否发生接触,但是不要产生碰撞的效果,可以使用触发器来进行接触检测。
这样在游戏物体发生接触的时候就不会有碰撞的效果了,而是会直接穿过去。Unity的碰撞器有很多类型,Cube的碰撞器类型是盒子碰撞器,另外还有球形碰撞器、胶囊体碰撞器等。
A.将food设为触发器类型
B.设置脚本
使用MonoBehaviour类的OnTriggerEnter、OnTriggerExit和OnTriggerStay是触发检测的三个回调方法,OnTriggerEnter在游戏物体发生接触时调用一次,OnTriggerExit在游戏物体完全分离时调用一次,而OnTriggerStay在游戏物体接触过程中持续调用。 触发器回调的这三个方法的参数都是Collider类型,表示的就是被碰撞的游戏物体的触发器组件对象。
在本次实验中使用的是OnTriggerEnter。
void OnTriggerEnter(Collider collider){if (collider.tag == "food"){GetComponent().Play();GameObject neweffect = (GameObject)Instantiate(effect, transform.position, effect.transform.rotation);neweffect.transform.parent = transform;Destroy(neweffect, 1.0f);score++;if (score == 5){wintext.SetActive(true);wininmage.SetActive(true);var z=GameObject.FindGameObjectsWithTag("food");for(int i=1;i