欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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 + "被弹起");
        }
    }
}

相关标签: 2D游戏