|
在上一篇手记中笔者用tk2D的精灵集合和精灵动画特性制作了《飞机大战》中飞机飞行的动画。本篇将使用C#脚本令飞机随着玩家触摸屏幕的位置而移动。由于之前已经为飞机的精灵创建了碰撞器用于检测机体和子弹,因此在此之前需要对现有的飞机进行改造。
按Ctrl+Shift+N创建一个新的对象,重命名为Aircraft,并将原有的Aircraft对象重命名为Body拖入作为它的子物体。
创建AircraftController.cs脚本,用于控制飞机的移动:
namespace Frederick.ProjectAircraft{
using UnityEngine;
///
/// 玩家飞机控制器。
///
[RequireComponent(typeof (BoxCollider))]
public class AircraftController : MonoBehaviour
{
///
/// 将飞机移动到指定位置。
///
///目标位置
public void MoveTo(Vector3 pos)
{
mAircraft.localPosition = pos;
}
protected void Awake()
{
mAircraft = transform;
}
protected void OnMouseDown()
{
mIsDragging = true;
mOffset = Input.mousePosition - mAircraft.localPosition;
}
protected void OnMouseUp()
{
mIsDragging = false;
}
protected void Update()
{
if (mIsDragging && Input.GetMouseButton(0))
{
var pos = Input.mousePosition - mOffset;
MoveTo(pos);
}
}
private Transform mAircraft;
private bool mIsDragging;
private Vector3 mOffset;
}
}
将脚本附加到Aircraft对象上,并设置好碰撞器的大小和位置,注意不要被机体本身的碰撞器遮挡住,否则无法响应鼠标按下事件。
点击运行游戏,在游戏窗口中的飞机上按住鼠标左键并拖动,可以看到飞机已经完全跟着鼠标位置走了。敌方飞机的控制器也是一样的原理,那就顺手再做个EnemyAircraftController。
namespace Frederick.ProjectAircraft
{
using UnityEngine;
///
/// 敌方飞机控制器。
///
public class EnemyAircraftController : MonoBehaviour
{
public float SpeedRate = 1.0f;
public float StantardSpeed = 100;
protected void Awake()
{
mTransform = transform;
}
protected void Update()
{
var position = mTransform.localPosition + mDirection * StantardSpeed * SpeedRate * Time.deltaTime;
if (position.y < 0)
{
Destroy(gameObject);
return;
}
mTransform.localPosition = position;
}
private readonly Vector3 mDirection = Vector3.down;
private Transform mTransform;
}
}
按照第一篇的步骤创建好敌方飞机Aircraft_Small,并把控制器附加上去,保存为预设。已经有那么点游戏的感觉了:)
图中的Missile是用来测试导弹发射的,将在下一篇手记中记录。
|
|