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

攻击点

配置参数

效果

目录
相关文章
|
4月前
|
图形学
小功能⭐️Unity获取场景中所有物体
小功能⭐️Unity获取场景中所有物体
小功能⭐️Unity获取场景中所有物体
|
4月前
|
前端开发 图形学
Unity精华☀️UI和物体可见性的判断方法
Unity精华☀️UI和物体可见性的判断方法
|
4月前
|
图形学
小功能⭐️获取Unity游戏物体上,所挂载组件的名称
小功能⭐️获取Unity游戏物体上,所挂载组件的名称
|
4月前
|
图形学
小功能⭐️解决Unity无法对一个物体上的所有材质球进行更改
小功能⭐️解决Unity无法对一个物体上的所有材质球进行更改
|
4月前
|
数据可视化 图形学
小功能⭐️Unity2018 Shader Graph——全息影像、物体消融
小功能⭐️Unity2018 Shader Graph——全息影像、物体消融
|
4月前
|
图形学
小功能⭐️Unity中利用材质自发光实现物体闪烁效果
小功能⭐️Unity中利用材质自发光实现物体闪烁效果
|
4月前
|
图形学
小功能⭐️Unity 如何判断物体是否在摄像机视野内或外
小功能⭐️Unity 如何判断物体是否在摄像机视野内或外
|
4月前
|
图形学
小功能⭐️Unity解决物体移动速度过快不能检测到碰撞
小功能⭐️Unity解决物体移动速度过快不能检测到碰撞
|
4月前
|
图形学
小功能⭐️不用传参,Unity获得鼠标悬浮处的物体、UI!
小功能⭐️不用传参,Unity获得鼠标悬浮处的物体、UI!
|
6月前
|
图形学 开发者
【Unity小技巧】unity移动物体的探究——使用8个不同方法
【Unity小技巧】unity移动物体的探究——使用8个不同方法
253 1