开始学习Unity了

  • 前言
  • 让物体动起来以及debug和优化
  • 创造反弹效果
  • 消除漂浮感


前言

最近在开始自学Unity,参考书籍为《Unity设计与实现 南梦宫一线程序员的开发实例》这本书。这本书基本都是实例,每一章对应一种游戏类型进行设计。先进行游戏雏形的提出和分析,然后是相应功能模块的设计与实现,最后是整体数据结构和算法的实现。由经验丰富的一线程序员编写,十分具有参考价值。文章主要是为了记录学习过程中一些重要知识和代码,督促自己的同时,也便于日后复习。

让物体动起来以及debug和优化

第一个项目是一个小游戏。就是一个鼠标左键点击Player就会跳起,右键点击小球就会从右边抛出来,目的是让Player撞到小球而体验击飞小球的快感。只是简单的入门而不做排行榜之类的分数,主要是熟悉一些功能和Object。这里所用语言都是C#
优化后的Player代码,以及对空中跳跃BUG的解决方法

public class Player:MonoBehaviour
{
	public float JumpHeight=4.0f;  //上升高度
	public bool is_landing=false;  //用于判断是否在地面上
    void Start()
    {
        this.is_landing=false;
    }
	void Update()
	{
	    if(this.is_landing)
		{
			if(Input.GetMouseButtonDown(0))  //鼠标单击,0位左键,1为右键,2位中键
			{
			    this.is_landing=false;
			    float y_speed=Mathf.Sqrt(
			        2.0f*Mathf.Abs(Physics.gravity.y)*this.JumpHeight;  //根据v=√2gh计算速度
				this.GetComponent<Rigidbody>().velocity=  //GetCompoment <T>()从当前游戏对象获取组件T,velocity速度
				    Vector3.up*y_speed;  //Vector3是一个xyz向量,Vector3.up是Vector3(0,1,0)的简写,相当于y轴的单位向量
				    //另外还有forward(z轴),right(x轴),one(xyz均为1),zero(xyz均为0)
			}
		}
	}
	void OnCollisionEnter(Collision collision)  //产生碰撞collision,函数用于防止空中再次跳跃
	{
	    if(collision.gameObject.tag=="Floor")  //给地面增加tag名为“Floor”后,就可以判断碰撞对象,为防止碰到小球再次跳跃
	    {
	        this.is_landing=true;
	    }
	}
}

Ball预设的代码,以及对屏幕外不可视小球的处理方法

void start()
{
    this.GetComponent<Rigidbody>().velocity=new Vector3(-7.0f,6.0f,0.0f);
}
void OnBecameInvisible()
{
    Destroy(this.gameObject);
}

Launcher发射台预设代码,ballPrefab需要外部把ball预设添加进来

public GameObject ballPrefab;
void update()
{
    if(Input.GetMouseButtonDown(1))  //右键点击响应
    {
        Instantiate(this.ballPrefab);  //实例化函数
    }
}

创造反弹效果

先是要调整重量,使Ball重量远小于Player,Player受小球撞击产生的影响尽可能小。
可是主要的还是要创造物理材质Physic Material,将Bounciness值变为1,这个值越大,越容易被弹开,然后把材质赋予Ball。

消除漂浮感

重力值设为9.8的话,Rigidbody组件会把1.0当做是1米,Player就变得相当巨大,因此下落会十分缓慢。可以通过减小物体尺寸来消除这种慢悠悠下落的感觉,但是更方便的是增加重力值。Edit->Project Settings->Physics里切换显示PhysicsManager,将Gravity的y值的绝对值调高一些。增加重力值后各项速度也要增加,不然跳的高度会变低。