【unity小技巧】实现投掷物品,比如长矛,刀具,手榴弹和其他物体

简介: 【unity小技巧】实现投掷物品,比如长矛,刀具,手榴弹和其他物体

最终效果

敌人代码

简单定义一个受伤方法

public class BasicEnemy : MonoBehaviour
{
    [Header("Stats")]
    public int health;

    public void TakeDamage(int damage)
    {
        health -= damage;

        if (health <= 0)
            DestroyEnemy();
    }

    public void DestroyEnemy()
    {
        Destroy(gameObject);
    }
}

配置

控制飞镖

代码控制飞镖插在目标上

public class ProjectileAddon : MonoBehaviour
{
    // 伤害值
    public int damage;

    private Rigidbody rb;  // 刚体组件引用

    private bool targetHit;  // 是否已经击中目标的标识

    private void Start()
    {
        rb = GetComponent<Rigidbody>();  // 获取子弹的刚体组件
    }

    private void OnCollisionEnter(Collision collision)
    {
        // 排除角色
        if (collision.gameObject.CompareTag("Player")) return;

        // 确保只粘附在第一个击中的目标上
        if (targetHit)
            return;
        else
            targetHit = true;

        // 检查是否击中了敌人
        if (collision.gameObject.GetComponent<BasicEnemy>() != null)
        {
            // 获取被击中的敌人组件
            BasicEnemy enemy = collision.gameObject.GetComponent<BasicEnemy>();

            // 对敌人造成伤害
            enemy.TakeDamage(damage);

            // 销毁子弹
            // Destroy(gameObject);
        }

        // 确保子弹粘附到表面
        rb.isKinematic = true;

        // 确保子弹随着目标移动
        transform.SetParent(collision.transform);
    }
}

配置参数,这里简单用个长条代替飞镖

投掷方法

public class ThrowingTutorial : MonoBehaviour
{
    [Header("References")]
    public Transform cam;  // 相机引用
    public Transform attackPoint;  // 攻击点引用
    public GameObject objectToThrow;  // 待投掷的物体

    [Header("Settings")]
    public int totalThrows;  // 总投掷次数
    public float throwCooldown;  // 投掷冷却时间

    [Header("Throwing")]
    public KeyCode throwKey = KeyCode.Mouse0;  // 投掷按键,默认鼠标左键
    public float throwForce;  // 投掷力量
    public float throwUpwardForce;  // 投掷上抛力量

    bool readyToThrow;  // 是否准备好投掷的标识

    private void Start()
    {
        readyToThrow = true;
    }

    private void Update()
    {
        if (Input.GetKeyDown(throwKey) && readyToThrow && totalThrows > 0)
        {
            Throw();
        }
    }

    //投掷
    private void Throw()
    {
        readyToThrow = false;

        // 实例化待投掷的物体
        GameObject projectile = Instantiate(objectToThrow, attackPoint.position, cam.rotation);

        // 获取刚体组件
        Rigidbody projectileRb = projectile.GetComponent<Rigidbody>();

        // 计算投掷方向
        Vector3 forceDirection = cam.transform.forward;

        RaycastHit hit;

        //检测从相机位置沿着相机正前方发射的500f射线是否与场景中的物体相交
        if (Physics.Raycast(cam.position, cam.forward, out hit, 500f))
        {
            //则更新投掷的方向为从攻击点到命中点的单位方向向量
            forceDirection = (attackPoint.position - hit.point).normalized;
        }

        // 添加力量
        Vector3 forceToAdd = forceDirection * throwForce + transform.up * throwUpwardForce;

        projectileRb.AddForce(forceToAdd, ForceMode.Impulse);

        totalThrows--;

        // 实现投掷冷却
        Invoke(nameof(ResetThrow), throwCooldown);
    }

    private void ResetThrow()
    {
        readyToThrow = true;
    }
}

攻击点

配置参数

效果

目录
相关文章
|
3天前
|
图形学 开发者
【Unity小技巧】unity移动物体的探究——使用8个不同方法
【Unity小技巧】unity移动物体的探究——使用8个不同方法
11 1
|
3天前
|
图形学
【unity小技巧】Unity中实现一个战斗连击连招系统,可以动态添加减少连击连招段数功能
【unity小技巧】Unity中实现一个战斗连击连招系统,可以动态添加减少连击连招段数功能
5 0
|
3天前
|
存储 图形学
【unity小技巧】unity事件系统创建通用的对象交互的功能
【unity小技巧】unity事件系统创建通用的对象交互的功能
7 0
|
3天前
|
图形学
【unity小技巧】unity通过代码进行更改后处理效果
【unity小技巧】unity通过代码进行更改后处理效果
6 0
|
3天前
|
图形学
【unity小技巧】unity3D寻路指示轨迹预测
【unity小技巧】unity3D寻路指示轨迹预测
10 0
|
3天前
|
图形学
【unity小技巧】unity读excel配置表操作,excel转txt文本,并读取txt文本内容,实例说明
【unity小技巧】unity读excel配置表操作,excel转txt文本,并读取txt文本内容,实例说明
8 0
|
3天前
|
编解码 算法 图形学
【unity小技巧】减少Unity中的构建打包大小
【unity小技巧】减少Unity中的构建打包大小
5 0
|
3天前
|
图形学
【unity小技巧】Unity人物衣服布料系统的探究 —— Cloth组件
【unity小技巧】Unity人物衣服布料系统的探究 —— Cloth组件
6 0
|
3天前
|
存储 JSON 关系型数据库
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
12 2
|
3天前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(上)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)
10 2