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
相关产品推荐
相关产品推荐

