【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;
    }
}

攻击点

配置参数

效果

目录
相关文章
|
10天前
|
图形学
Unity 获取鼠标位置下的UGUI或3D物体
本文总结了两种检测方法,分别用于UGUI和3D物体的检测。第一种方法`GetOverUIobj`专门用于检测鼠标悬停的UGUI元素,通过`GraphicRaycaster`实现。第二种方法`GetOverWordGameObject`则同时适用于UI和3D物体检测,利用`PhysicsRaycaster`进行射线检测。两者均返回悬停对象或null。
|
10天前
|
图形学
unity 物体震动
在Unity中实现物体震动效果,主要通过改变物体的位置、旋转或缩放属性来模拟震动。以下是位置震动的实现原理及代码示例:通过随机生成微小偏移量并累加到物体位置上,在短时间内不断改变位置产生震动效果。生成随机偏移,并结合时间控制持续震动。
|
10天前
|
前端开发 图形学
unity UGUI跟随3D物体的坐标转换
在 Unity 中实现 UGUI 元素跟随 3D 物体,关键是将 3D 物体的世界坐标转换为屏幕或画布坐标。通过 Camera.WorldToScreenPoint 方法,可将 3D 物体位置映射到屏幕上,再更新 UGUI 元素的位置。代码示例展示了如何使用该方法,使 UGUI 图像跟随 3D 模型,并提供文字显示、图像和线条的显示/隐藏功能。
|
10天前
|
存储 图形学 索引
unity 使物体跟随路径点自动移动位置
在Unity中,物体沿路径点自动移动的核心原理是通过预设路径点,控制物体依次移动。路径点可用空对象或三维向量数组定义,并按顺序存储。移动时,计算当前位置与下一个路径点的向量差以确定方向,使用`Vector3.MoveTowards`逐步靠近目标点。代码实现包括路径点设置、移动控制及插值计算,确保物体平滑移动和旋转。
|
10天前
|
图形学
Unity 射线移动物体Ray
在Unity中,通过射线检测实现3D物体的拖拽和移动。射线由起点和方向组成,使用`Physics.Raycast`检测与物体的交点。点击物体时,记录位置偏移量,拖动过程中更新物体位置。代码包括基本拖拽和上下拖动功能,适用于正交摄像机场景。测试时为物体设置特定标签(如&quot;JQR&quot;)以便区分和操作。 示例代码展示了如何通过鼠标事件控制物体移动,并结合层级掩码优化射线检测。具体实现包括:点击选中物体、拖动更新位置、释放鼠标取消选择。此外,提供了上下拖动的额外功能,通过按键切换模式。
|
10天前
|
图形学 开发者
unity 从工具栏拖动生成物体
在 Unity 中实现从工具栏拖动生成物体的功能,基于编辑器扩展、事件系统和预制体实例化。通过自定义编辑器窗口、处理鼠标事件(按下、移动、释放)及使用 Instantiate 方法,可实现拖动并生成预制体物体。代码示例展示了如何检测鼠标事件并在指定位置实例化物体。
|
6月前
|
图形学
小功能⭐️Unity获取场景中所有物体
小功能⭐️Unity获取场景中所有物体
小功能⭐️Unity获取场景中所有物体
|
6月前
|
前端开发 图形学
Unity精华☀️UI和物体可见性的判断方法
Unity精华☀️UI和物体可见性的判断方法
|
6月前
|
图形学
小功能⭐️获取Unity游戏物体上,所挂载组件的名称
小功能⭐️获取Unity游戏物体上,所挂载组件的名称
|
6月前
|
图形学
小功能⭐️解决Unity无法对一个物体上的所有材质球进行更改
小功能⭐️解决Unity无法对一个物体上的所有材质球进行更改