C++:世界上唯一能让程序员在配置环境上比写代码还累的语言 😅|

香菇0_0

园龄:2年7个月粉丝:10关注:1

【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内运行产生了卡顿,实际运行不会卡。

 

 

本文作者:香菇0_0

本文链接:https://www.cnblogs.com/Xiang-gu/p/16953931.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   香菇0_0  阅读(526)  评论(0编辑  收藏  举报
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.
点击右上角即可分享
微信分享提示