/// 时间:2014/7/31pm 6:12
/// 2D游戏开发入门笔记(射击游戏)
/// 完成了第一部分基本内容,如移动,射击,击中效果等
/// 王小龙
第一部分基本上是在昨天就已经完成了多部分功能。回忆是最好的一种学习方式。
在开发游戏之前,需要一系列的准备工作,当然也不可能把所有的准备都做完,其中就拿本游戏来讲。由于本游戏比较简单,所以在开发之前就已经把相应的图片和素材准备好了。比如背景图片,主角图片,敌人等。值得一提的是,Unity可以分割图片中的某些部分以便当成不一样的部分来处理,这点会在后面讲到。
有了开发的资源就(在这里没有完全按照软件工程中的开发过程)可以动手实践了。首先我们想好有哪些资源,大致给各个资源归类一下。常见的可以有,脚本,预设,声音,动画,贴图,场景,模型等。最好为每类资源建立一个文件夹。在这里推荐一个小技巧,在给文件夹命名的时候,推荐用 _Name(表示是自己的原创资源),Name(表示非原创资源)。这样有利于在以后自己区分。
开发的是一款2D游戏,在场景方面,我一般先把场景分为多个个层次。这里分为了Back,MID,Fore3层。然后在不同层次进行操作。在back中添加背景等,Mid添加主要的移动的背景,Fore添加主要对象。具体的方法就是通过添加空游戏对象(GameObject)。然后在自己根据情况去设置对象的父子关系,添加相应的组件等。
本游戏中,层次如下。需要说明一下,如何把一张图分为几个部分。1、texturetype是spirte。2、sprite mode是mutiple然后点击编辑即可进行分割。
分割完成如下
接下来就是添加主角和敌人还有武器等东东了。其实都差不多。提一下,添加的组件1、碰撞器2、刚体。通常这两者同时使用。在碰撞其中勾上触发,则碰撞的时候不受物理引擎控制,而受脚本的控制。在添加刚体时,应该注意2D游戏中质量或者重力应该为0.如果不想物体旋转则可以固定角度(fixed angle)
完成了上面场景的基本设置之后接下来就是写控制脚本了.在这里总结一下。我认为简单游戏开始的时候做好各个基础的场景之后,在去写相应的脚本功能这里由易到难,比较容易。
先来写角色位移的控制脚本。先来大致想一下。场景中涉及到主要 三个对象。飞行器,敌人和子弹。其中子弹和敌人可以使用相同的脚本,只要设置不同的方向就可以了。
具体说来,角色控制,一般会想到通过transform来实现位移。但是那样可能不会和其他物体产生碰撞,所以通过刚体来实现位移。关键语句如下:
movement = new Vector2(
speed.x * inputX,
speed.y * inputY);
rigidbody2D.velocity = movement;
接下来说下比较难一点的就是射击如何处理。涉及到的对象还是三个多作为预设保存,发射子弹,就是让子弹出发位置是飞行器位置。关键代码:
public void Attack(bool isEnemy)
{
if (CanAttack)
{
shootCooldown = shootingRate;
// Create a new shot
var shotTransform = Instantiate(shotPrefab) as Transform;
// Assign position
shotTransform.position = transform.position;
// The is enemy property
ShotScript shot = shotTransform.gameObject.GetComponent<ShotScript>();
if (shot != null)
{
shot.isEnemyShot = isEnemy;
}
// Make the weapon shot always towards it
MoveScript move = shotTransform.gameObject.GetComponent<MoveScript>();
if (move != null)
{
move.direction = this.transform.right; // towards in 2D space is the right of the sprite
}
}
}
/// <summary>
/// Is the weapon ready to create a new projectile?
/// </summary>
public bool CanAttack
{
get
{
return shootCooldown <= 0f;
}
}
}
在飞行器的脚本中添加:
oid Update()
{
// ...
// 5 - Shooting
bool shoot = Input.GetButtonDown("Fire1");
shoot |= Input.GetButtonDown("Fire2");
// Careful: For Mac users, ctrl + arrow is a bad idea
if (shoot)
{
WeaponScript weapon = GetComponent<WeaponScript>();
if (weapon != null)
{
// false because the player is not an enemy
weapon.Attack(false);
}
}
// ...
}
好吧今天到此位置