【Unity2D】实现打怪掉落物品(如爆金币等)的功能

本文章记录实现打怪掉落物品的功能,以下代码为2D实现,3D模式稍加修改即可。

目录

一、代码部分

二、注意事项

三、效果展示


一、代码部分

创建一个C#脚本命名为Item,并将该脚本挂载到需要掉落的物品上。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(Rigidbody2D))]
[RequireComponent(typeof(BoxCollider2D))]
public class Item : MonoBehaviour
{
    // Start is called before the first frame update
    void Awake()
    {
        // 反弹材质
        var physicMat = new PhysicsMaterial2D();
        physicMat.bounciness = 0.25f;

        _rb = GetComponent<Rigidbody2D>();
        _rb.velocity = new Vector2(Random.Range(-1f, 1f), 2f);
        _rb.freezeRotation = true;
        _rb.sharedMaterial = physicMat;
        gameObject.layer = LayerMask.NameToLayer("Item");
    }

    private void Start()
    {
        if(_owner == null)
        {
            _owner = GameObject.FindWithTag("Player").transform;
        }
    }

    // Update is called once per frame
    void Update()
    {
        if(!_bMagnet && Vector2.Distance((Vector2)transform.position, (Vector2)_owner.position) <= _fRange)
        {
            _bMagnet = true;
        }

        if(_bMagnet)
        {
            Vector3 dir = Vector3.MoveTowards(transform.position, _owner.position, _fMagnetSpeed * Time.deltaTime);
            _rb.MovePosition(dir);
            if(Vector2.Distance((Vector2)transform.position, (Vector2)_owner.position) <= 0.1f)
            {
                Picked();
            }
        }
    }

    void Picked()
    {
        // 添加捡到物品的逻辑

        Destroy(gameObject);
    }

    private void OnDrawGizmos()
    {
        if (_bShowRangeInScene)
        {
            Gizmos.color = new Color(1, 1, 0, 0.3f);
            Gizmos.DrawCube(transform.position, new Vector2(_fRange * 2, _fRange * 2));
        }
    }

    public float _fRange = 1; // 自动吸物品范围
    public float _fMagnetSpeed = 10; // 吸取速度
    public Transform _owner; // 捡到物品的人

    [SerializeField]
    bool _bShowRangeInScene = false; // 是否在场景中显示范围

    Rigidbody2D _rb; // 

    Vector2 _originSpeed; // 物品发射速度
    bool _bMagnet = false; // 是否被吸住
}

二、注意事项

1.需要禁用掉落物品与自身和其他人物之间的碰撞(否则可能被物品撞飞)。

三、效果展示

unity内运行产生了卡顿,实际运行不会卡。

 

 

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值