Roll A Ball

GameObject的添加就不细说了,地面,小球和碰撞小物体。

刚体组件(Rigidbody):

使物体能够模拟物理效果,比如重力,碰撞,推力等;

 

控制小球移动的脚本(Script,Ball的脚本):

  Input.GetAxis("Horizontal"):控制横向运动键,有A,D键;

  Input.GetAxis("Vertical"):控制纵向运动键,有W,S;

  AddForce(Vector3):添加力,力是矢量,有方向;

 

控制相机跟随物体移动(第一视角):

  把相加直接拖到物体上,作为物体的子对象,但是这里行不通,因为小球是圆球,移动起来是旋转的,相机也会随着选装,导致物体在整个画面中一直在颠倒旋转。另一种方法是相机和物体的位移保持不变,也就是相机的中心和小球的中心始终保持着一定的距离,该距离用向量表示。

  通过Transform.position得到各个物体的位置,是个点坐标。定义一个公共变量,为主角Ball的Transform对象。通过小球的位置,和两者位置的偏移量获得相机的位置。

 

由于场地周围没有任何阻碍,小球会离开地面,然后受重力作用往下落。所以在场地周围增加墙,来限制小球的运动范围

 

创建小球要收集的食物(Foods):

  创建一个cube,调整角度,然后将其制成prefab,为了方便之后对所有食物的统一修改。多个食物的创建,目前是利用prefab重复拖动到Scene中,或者在在Scene中使用快捷键ctrl+D来创建(这里暂时不描述怎么动态随机创建物体,只是初级简单的创建)。prefab的好处是方便修改所有利用prefab创建的物体的属性的修改。控制食物动态旋转,利用transform.Rotate(new Vector3(0, 1, 0))。由于食物较多,所以创建一个空的GameObject,统一管理这些物体。食物的Box Collider组件中如果不勾选Is Trigger属性,小球,无法穿过食物,勾选后可以穿透食物。

 

检测是否发生碰撞:

  1.碰撞检测;2.触发检测;3.射线检测;

  碰撞首先物体得依赖于刚体

  1.OnCollisionEnter(Collision col);

  2.OnTriggerEnter(Collider col);

  顺便一提Resharper插件,以后介绍

 

分数显示和结束画面:

  这里UI使用的是UGUI,在Hierarchy面板中右键创建UI中的Text,然后设置Text位于UI的Canvas的位置:

  

  而使这些字在结束时显示,则使用SetActive(true)。

 

源代码:

 1 using UnityEngine;
 2 using System.Collections;
 3 using UnityEngine.UI;
 4 
 5 public class BallControl : MonoBehaviour {
 6     public int force = 5;
 7     private Rigidbody rd;
 8 
 9     private int score = 0;
10 
11     public Text text;
12     public GameObject winText;
13     // Use this for initialization
14     void Start () {
15         rd = gameObject.GetComponent<Rigidbody>();
16     }
17     
18     // Update is called once per frame
19     void Update () {
20         float h = Input.GetAxis("Horizontal");
21         float v = Input.GetAxis("Vertical");
22         print(h + "");
23         print(v + "");
24         rd.AddForce(new Vector3(h, 0, v) * force);
25     }
26 
27     void OnCollisionEnter(Collision col)
28     {
29         if (col.collider.tag == "Food")
30         {
31             Destroy(col.collider.gameObject);
32         }
33     }
34 
35     void OnTriggerEnter(Collider col)
36     {
37         if (col.tag == "Food")
38         {
39             score++;
40             text.text = score.ToString();
41             if (score == 12)
42             {
43                 winText.SetActive(true);
44             }
45             Destroy(col.gameObject);
46         }
47     }
48 }
using UnityEngine;
using System.Collections;

public class FoodsControl : MonoBehaviour {

    // Use this for initialization
    void Start () {
    
    }
    
    // Update is called once per frame
    void Update () {
        transform.Rotate(new Vector3(0, 1, 0));
    }
}
 1 using UnityEngine;
 2 using System.Collections;
 3 
 4 public class FollowTarget : MonoBehaviour {
 5 
 6     public Transform playerTransform;//声明对象的位置
 7     private Vector3 offset;//位置偏移量
 8 
 9     // Use this for initialization
10     void Start () {
11         offset = this.transform.position - playerTransform.position;
12     }
13     
14     // Update is called once per frame
15     void Update () {
16         //根据小球的位置和偏移量得到相机的位置
17         transform.position = playerTransform.position + offset; 
18     }
19 }

 

 

 

posted @ 2016-06-20 23:27  黄豆kes  阅读(821)  评论(0编辑  收藏  举报