本文章记录实现打怪掉落物品的功能,以下代码为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内运行产生了卡顿,实际运行不会卡。