Unity3D游戏开发--基础游戏 Roll a ball 学习笔记

Unity3D-Roll a ball 学习笔记

  • 思路
  • 脚本
    • 首先是小球运动脚本。
    • 摄像机脚本
    • 方块旋转
  • 其他
  • 思考

思路

这个项目主要是新手熟悉基础的脚本编写。
键盘控制小球,小球碰到方块时方块消失。
脚本总共有三个,用于实现由键盘输入控制小球走向及处理碰撞事件;摄像机视野跟随小球运动;方块的旋转。
首先建立基础的gameObject——底层plane,墙cube,小球sphere和碰撞的方块quad。
文件Materia用于配置gameObject诸如颜色、平滑度等外观属性,拖拉到scene上的指定物体就能配置。
在transform组件上适当调整坐标拉伸
Unity3D游戏开发--基础游戏 Roll a ball 学习笔记_第1张图片

脚本

首先是小球运动脚本。

小球运动的思路是获得键盘输入并且赋值给物理组件的velocity速度函数,乘一个变量便于于在Inspector面板中输入,控制速度大小。
小球运动碰撞的墙时会掉下去,原因是物理的碰撞挤压小球使小球往下掉,解决方法是锁定y轴使其不发生改变。
小球碰撞的思路是当小球碰到方块时,该方块停止活动(active=false),停止活动就不会显示在场景中,实现方块的消失。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ball : MonoBehaviour {

    Rigidbody rigidbody;
    public float Total;
    public float Mulity;
    int count = 0;
    void Start () {
        rigidbody = this.GetComponent <Rigidbody>();//动态获取物理组件引用
        Total = GameObject.FindGameObjectsWithTag("box").Length;//获得指定tag值的对象的数目

    }

	void Update () {//所有的输入都封装在Input类中
        float h = Input.GetAxis("Horizontal");//获得左右方向
        float v = Input.GetAxis("Vertical");//获得前后方向
        Vector3 vector = new Vector3(h, rigidbody.velocity.y, v);
        rigidbody.velocity = vector * Mulity;
        //rigidbody组建控制物理运动 Vector3 三维向量作为速度的参数
	}

    private void OnCollisionEnter(Collision collision)
    {
        //当碰撞器检测到碰撞的时候
        //collision碰撞事件,collider碰撞到的对象
        if (collision.collider.tag == "box")
        {
            collision.collider.gameObject.SetActive(false);//设置碰撞对象的active属性,当active=false时不显示
            //也可以用destry函数,但是创建和销毁对象都需要时间,可能会造成卡顿
            count++;
            print(count);
        }
        if (count == Total)
            print("Game Over");



    }
}

摄像机脚本

摄像机跟随小球运动,实质上就是根据小球的位置改变摄像机的位置。记录初始小球与摄像机的偏移量,每次更新摄像机位置=取出小球的位置+偏移量。
还有一种方法是直接把主摄像机放到小球下面作为子物体就能实现相机跟随。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class cameraFollw : MonoBehaviour {
    public Transform ballTransform;
    private Vector3 b_cOffset;
	// Use this for initialization
	void Start () {
        Vector3 ballPosition = ballTransform.position;
        b_cOffset = transform.position - ballPosition;
	}
	
	// Update is called once per frame
	void LateUpdate () {
        transform.position = ballTransform.position + b_cOffset;
	}
}

方块旋转

方块旋转就是修改方块transform组件中的rotate的值。乘Time.deltaTime是让旋转变得平滑,deltaTime是上一帧到这一帧的间隔时间(可以用此来计时),乘一个变量原因同上。注意向量的值是float类型。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class boxRote : MonoBehaviour {

    // Use this for initialization
    public float Mutily;
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        transform.Rotate(new Vector3(10f, 15f, 10f) * Time.deltaTime* Mutily);

    }

}

其他

1.如果方块数量很多,先制作一个方块作为预设Prefabs,拖放到Assets的自定义的文件夹下,之后对这个方块的修改,将会连带为所有其副本更新,方便修改。 小球脚本中的tag值就是修改预设中的tag值,使所有目标小方块tag值统一,方便统计数目。
2.脚本中的引用可以在unity中手动设置,此时引用变量在脚本中要设置为public型,这样才会在Inspector视图中的相应脚本文件下显示出来。如果是自定义的类的话,还要将该类设置为可序列化。
3.脚本中的print函数是在控制台输出信息。

思考

物体的运动、事件的触发都是由脚本实现的。
目前看来,unity是面向对象的可视化编程,一切物体都是对象,有属性和方法。
组件是不同方面的属性与方法的类的封装。
脚本中可以直接使用组件小写名词的组件实例进行操作,比如Ball小球下的脚本中transform就是小球的位置信息,如果此时需要别的物体的相关信息,就先用tag值取出这个GameObject——或者用find函数通过name取出,再进行操作
方块的旋转有更简单的方法实现,在star函数为刚体实例的角速度 rigidbody.angularVelocity赋值就可以实现

你可能感兴趣的:(自学笔记,Unity3D自学)