开始学习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值的绝对值调高一些。增加重力值后各项速度也要增加,不然跳的高度会变低。