【Unity】Jay 开发日志(一)——人物的移动、死亡与平台跳跃

写在最前面:Jay 是我花了五天左右时间开发的同名游戏,基础机制借鉴了涂鸦跳跃,具体的参考视频可以点击以下链接

用周杰伦的第一张专辑Jay做了个游戏(祝杰伦118生日快乐)_单机游戏热门视频

这篇日志将记录如何实现人物的移动、跳跃和死亡。

(一)人物的移动

1)   为了方便后续各种机制的实现,在创建人物时创建一个 empty object,命名为Jay, 挂载 Box Collider 2D(用来检测与平台的碰撞),Rigidbody 2D,Audio Source (用来播放与平台碰撞产生的音效) 以及 Player 脚本 (用来管理人物的移动和死亡等等)。

在 Jay 下创建两个新的子物体, ProsDetector 挂载了 Box Collider 2D(用来检测与道具的碰撞),Audio Source (用来播放与道具产生交互时的音效)以及Special Effect 脚本(管理了所有的道具特效的实现)。另一个子物体 GFX 仅负责显示人物的图形。

 2)   回到主题。操控角色左右移动的思路很简单,根据控制器输入改变刚体x方向上的速度即可。打开 Player 脚本,提前申明浮点型变量 movement 和 movementSpeed, 在 Update 中进行如下赋值:

movement = Input.GetAxis("Horizontal") * movementSpeed;

在 FixedUpdate 中改变刚体的速度:

//Move
Vector2 velocity = rb.velocity;
velocity.x = movement;
rb.velocity = velocity;

(二) 人物的死亡

在这个游戏中,人物一旦掉出视野外即视为死亡。为了实现这一功能,需要在 Start 中提前获取主相机。然后在 FixedUpdate 中,检测人物的位置与屏幕中心的差值:

//Dying
Vector3 Center = new Vector3(Screen.width / 2, Screen.height / 2, 0);
if (Cam.ScreenToWorldPoint(Center).y - transform.position.y > 5f)
{
    isDead = true;
    End = true;
}

注意这里需要把屏幕坐标转化为世界坐标。这里的 isDead 和 End 是用来作为触发死亡音效以及UI等等效果的标志,在以后记录到对应模块时会详细解析。 

(三)平台跳跃

1)  这个游戏一共有三种平台,普通平台、可移动平台以及会消失的平台。在三种平台上的跳跃逻辑一致。首先为了保证人物只能从平台上方触发碰撞,在平台下方则不会,需要使用 Edge Collider 2D 并且勾选 Used By Effector,然后添加 Platform Effector 2D 组件,勾选 Use One Way 并将 Surface Arc 改为 90。完成后,创建 Platform 脚本, 写入如下代码:

 private void OnCollisionEnter2D(Collision2D collision)
    {
        // Bouncing
        if (collision.relativeVelocity.y <= 0f)
        {
            Rigidbody2D rb = collision.collider.GetComponent<Rigidbody2D>(); 
            AudioSource ad = collision.collider.GetComponent<AudioSource>();

            if (rb != null)
            {
                Vector2 velocity = rb.velocity;
                velocity.y = jumpForce;
                rb.velocity = velocity;
            }

            // 播放跳跃音效
            if (ad != null)
            {
                ad.clip = collision.collider.gameObject.GetComponent<Player>().audioClips[0];
                ad.Play();
            }
        }
    }   

2)  对于可移动的平台,其具有固定的移动路线和随机的移动速度,创建新脚本 MovingPlatform ,实现代码如下:

    void Start()
    {
        speed = Random.Range(2,4); // 生成随机的移动速度
        Cam = Camera.main; 
        Vector3 levelWidth = new Vector3(Screen.width, 0, 0);

        Pos[0].x = -Cam.ScreenToWorldPoint(levelWidth).x + 0.7f; // 屏幕左端
        Pos[0].y = transform.position.y;
        Pos[1].x = Cam.ScreenToWorldPoint(levelWidth).x - 0.7f;  // 屏幕右端
        Pos[1].y = transform.position.y;

        nextPos = Pos[Random.Range(0,2)]; // 生成随机的初始移动方向
    }

    // Update is called once per frame
    void Update()
    {
        if (transform.position == Pos[0])
        {
            nextPos = Pos[1];
        }
        if (transform.position == Pos[1])
        {
            nextPos = Pos[0];
        }

        // 在两个端点位置中来回移动
        transform.position = Vector3.MoveTowards(transform.position, nextPos, speed * Time.deltaTime);  
    }

    private void OnDrawGizmos()
    {
        Gizmos.DrawLine(Pos[0], Pos[1]); //画出移动路线便于在 Scene 中观察
    }

3)  对于会消失的平台,在跳跃过后使用 Destroy 将其摧毁。

4)  对于所有平台,当其离开视野范围时,应当将其摧毁,逻辑类似于人物的死亡。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值