• 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 }
    
    
    
     
  • 相关阅读:
    网恋现代人的童话
    男人爱女人
    在Web页面中管理服务
    wcf使用入门学习笔记
    table显示细线边框
    wcf整理资料
    启动sqlserver服务的时候报错
    命名规范
    .net中使用xsl文件作为导航菜单
    wcf如何选择绑定
  • 原文地址:https://www.cnblogs.com/kesteler/p/5602178.html
Copyright © 2020-2023  润新知