首先,本人个人尤其喜欢ARPG游戏,原因在于ARPG游戏不仅可以通过修改游戏难度考验玩家的个人操作能力,还可以通过或感人,或令人发省的游戏剧情引导玩家一步一步的思考,最终明白制作者或者制作团队想要倾诉的感情。不论是在制作ARPG游戏抑或是其他什么类型的游戏,人物的操纵都应该是最优先考虑的问题。我们想做什么样的游戏,怎么操作,在这种模式下怎么使用最普通的资源实现怎么样令人眼前一亮的想法与创新是最基础也最重要的问题。今天就来说明这最基础的东西——传统ARPG游戏的6种人物行走方式。本人也是一名大三学生,课程虽已接近结束,但是还是需要为一些不知所谓的考试没日没夜的烦恼着,唉,不谈了。直接进入正题。
我将传统ARPG游戏的操作方式分为6种,区分的根据主要是按照现已存在的游戏的操作方式进过分析后加以区分归类,这时要首先感谢我这群跟我一样喜爱游戏,并且拥有十分广大游戏经验的舍友,他们在我进行游戏操作方式分析过程中给予了十分详细的经验介绍和帮助。好,我对ARPG游戏操纵方式的分类是:
1) 经典2D横版操作方式,如GBA版本的《恶魔城》系列;
2) 经典2D全屏行走操作方式,如某腾旗下的《地下城与勇士》系列;
3) 经典3D固定角度操作方式,如仙剑系列的地图行走方式;
4) 经典3D开放角度操作方式,如日本SQUARE ENIX旗下的一款《最终幻想零式》游戏。
5) 经典3D无锁定视角操作方式,我自己在写的一款游戏就是采用这种操作方式,这次正好用上了;
6) 经典3D固定面向方向操作方式,如盛大旗下代理的一款韩国游戏《龙之谷》;
好,接下来,sunset对每种类型的操作方式进行了独立分析,并使用编写了简单的实现脚本。
1) 经典2D横版操作方式
相信提到《恶魔城》这款游戏,大多人都是不陌生的甚至玩过该系列的全部版本,它是一款非常非常接近我们童年的一款ARPG游戏。首先,2D恶魔城的操作方式根据视觉感官给我们的感受就是简单按下左键进行左向移动,按下右键进行右向移动,按下跳跃键进行跳跃,实际上也是如此。在实现难度上属于较为简单的。但是有两种实现这种操作方式的方法,第一种是使用对刚体添加向左或者向右的力的方式实现,第二种则是通过修改刚体的向量的方式进行实现,首先是第一种方式的实现代码:
public enum State
{
Idle,
Crounch,
Walk,
Jump,
}
public float MoveForce = 365.0f;
public float MaxSpeed = 5.0f;
public float JumpForce = 360;
//private Variable
private float V, H;
private Rigidbody2D rigi;
private State state = State.Idle;
private float CurrentForce;
private bool Jump;
private Transform Ground;
private bool OnGround = false;
// Use this for initialization
void Start ()
{
rigi = this.GetComponent<Rigidbody2D>();
Ground = transform.Find("Ground");
}
// Update is called once per frame
void Update ()
{
OnGround = Physics2D.Linecast(transform.position, Ground.position, 1 << LayerMask.NameToLayer("Ground"));
V = Input.GetAxis("Vertical");
H = Input.GetAxis("Horizontal");
if (Input.GetKeyDown(KeyCode.J) && OnGround)
{
Jump = true;
}
JudgeState();
}
void FixedUpdate()
{
if (H * rigi.velocity.x < MaxSpeed && state != State.Crounch)
{
rigi.AddForce(Vector2.right * H * CurrentForce);
}
if (Mathf.Abs(rigi.velocity.x) > MaxSpeed && state != State.Crounch)
{
rigi.velocity = new Vector2(Mathf.Sign(rigi.velocity.x) * MaxSpeed, rigi.velocity.y);
}
if (Jump)
{
state = State.Jump;
rigi.AddForce(new Vector2(0, JumpForce));
Jump = false;
}
if (V < -0.3)
{
state = State.Crounch;
}