You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity钓鱼游戏开发问题:销毁浮漂克隆、更新投掷次数及显示提示

钓鱼游戏浮漂逻辑实现方案

需求回顾

  • 在Fish()方法内销毁浮漂克隆对象
  • 调用Поплавок脚本的totalThrows变量并增加其值
  • 屏幕显示"You caught a fish"提示文本

分步解决方案

1. 销毁浮漂克隆对象

由于CollisionScript直接挂载在浮漂克隆上,在Fish()中调用Destroy(gameObject)即可销毁当前浮漂克隆(gameObject指代脚本所属的浮漂克隆实例)。

2. 增加totalThrows计数

推荐在生成浮漂克隆时直接传递Поплавок实例引用,避免低效的全局查找:

修改Поплавок脚本的Throw()方法

在生成浮漂后,传递当前脚本的引用给浮漂的CollisionScript:

private void Throw()
{
    readyToThrow = false;

    GameObject projectile = Instantiate(objectToThrow, attackPoint.position, cam.rotation);
    
    // 获取浮漂上的CollisionScript并传递引用
    CollisionScript collisionScript = projectile.GetComponent<CollisionScript>();
    if (collisionScript != null)
    {
        collisionScript.thrower = this;
    }

    Rigidbody projectileRb = projectile.GetComponent<Rigidbody>();
    Vector3 forceToAdd = cam.transform.forward * throwForce + transform.up * throwUpwardForce;
    projectileRb.AddForce(forceToAdd, ForceMode.Impulse);

    totalThrows--;
    Invoke(nameof(ResetThrow), throwCooldown);
}
修改CollisionScript脚本

添加引用变量并完善核心逻辑:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro; // 引入TMP命名空间

public class CollisionScript : MonoBehaviour
{
    private Rigidbody rb;
    private float timer;
    private bool targetHit; // 防止重复触发Fish()
    public Поплавок thrower; // 存储投掷脚本的引用
    public TMP_Text _title; // 绑定提示文本组件
    private float texttimer;

    private void Start()
    {
        rb = GetComponent<Rigidbody>();
        targetHit = false;
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.GetComponent<Conveyor>() != null)
        {
            rb.isKinematic = true;
            transform.SetParent(collision.transform);
            SetTime();
        }
    }

    void SetTime()
    {
        timer = 15;
    }

    void Update()
    {
        // 钓鱼计时器逻辑
        if (timer > 0)
            timer -= Time.deltaTime;
        else if (timer <= 0 && !targetHit)
        {
            targetHit = true;
            Fish();
        }

        // 提示文本计时器逻辑
        if (texttimer > 0)
            texttimer -= Time.deltaTime;
        else if (texttimer <= 0)
        {
            _title.text = "";
        }
    }

    void Fish()
    {
        // 1. 销毁当前浮漂克隆
        Destroy(gameObject);

        // 2. 增加totalThrows计数
        if (thrower != null)
        {
            thrower.totalThrows++;
        }

        // 3. 显示钓鱼成功提示
        texttimer = 5;
        _title.text = "You caught a fish!";
    }
}

3. 注意事项

  • 在Unity编辑器中,将CollisionScript的_title字段绑定到场景中的TMP文本组件
  • 修正原代码中void Fish();的语法错误(移除多余分号)
  • targetHit变量用于避免Update重复调用Fish(),防止多次销毁和计数错误

内容的提问来源于stack exchange,提问作者Nnatto natto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 12:55:55