2D游戏——2021年5月25日
程序员文章站
2024-03-16 18:07:34
...
介绍
在上一篇博文中,我们介绍了2种地形机关——可移动平台和可破碎平台,在本篇博文中,我们继续介绍其他地形机关的设计。
可触发地形
介绍
在2D游戏中,我们常常会遇到这样的情况,一个地形在正常情况下无法通过,必须通过一些机关去触发它。简单来说,我们可以把这种机关想象成一个电梯,打开对应的开关,它会朝一个方向移动。
那么该机关类具有的属性就显而易见了,包括移动方向、速度、单程时间,方法主要有移动,它同样需要实现Movable接口。
还有一个细节需要注意,我们在游戏中只想让这个机关触发一次,即再触碰开关它就不会再去移动了,这时我们需要在第一次启动机关后就令其失效。
代码
/**
* @Description: TriggerablePlatform为可触发的平台类,由Switch机关触发。默认脚本失效,在被触发后生效
* @Author: CuteRed
*
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TriggerablePlatform : Mechanism, Movable
{
[Header("移动参数")]
public float speed = 1.0f;
public Vector3 direction = new Vector3(0, 1, 0);
public float moveTime = 2.5f;
private float passTime = 0.0f;
protected override void Start()
{
base.Start();
enabled = false;
}
private void Update()
{
//更新时间
UpdateTime();
//移动
Movement();
}
/// <summary>
/// 向上移动
/// </summary>
public void Movement()
{
//向指定方向移动
transform.position += direction * speed * Time.deltaTime;
}
/// <summary>
/// 触发
/// </summary>
/// <param name="triggerType"></param>
public override void Trigger(TiggerType triggerType)
{
enabled = true;
}
/// <summary>
/// 更新时间
/// </summary>
private void UpdateTime()
{
passTime += Time.deltaTime;
if (passTime > moveTime)
{
enabled = false;
}
}
/// <summary>
/// 触发检测(在此类中用不到)
/// </summary>
/// <returns></returns>
protected override bool TriggerDetect()
{
return true;
}
}
弹性机关
介绍
除了可触发地形外,我们还设计了一种弹性机关。它的初衷是模仿弹簧,当物体在它上面时,会给它附加一个弹力。那么实现起来,只需要检测是否有玩家或者其他物体触碰它,给触碰它的物体或玩家一个弹力即可。
代码
/**
* @Description: ElasticPlatform是弹性地形类,有刚体的物体在上面会被弹起
* @Author: CuteRed
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ElasticPlatform : MonoBehaviour
{
/// <summary>
/// 玩家移动组件
/// </summary>
MovementPlayer movementPlayer;
[Header("位移参数")]
public Vector2 force = new Vector2(0, 1);
private void Start()
{
movementPlayer = GameObject.Find("Player").GetComponent<MovementPlayer>();
if (movementPlayer == null)
{
Debug.LogError("在" + gameObject.name + "中,找不到MovementPlayer组件");
}
}
private void OnCollisionEnter2D(Collision2D collision)
{
Rigidbody2D rigidbody;
if (collision.gameObject.TryGetComponent<Rigidbody2D>(out rigidbody))
{
//如果是玩家,则调用玩家的移动组件
if (collision.gameObject.name == "Player")
{
movementPlayer.RequestMoveByTime(force, 1.5f, MovementPlayer.MovementMode.PlayerControl);
}
//如果是其他物体,则调用刚体的操作
else
{
rigidbody.velocity = force * 2;
}
Debug.Log(collision.gameObject.name + "被弹起");
}
}
}