Unity2d 坦克大战玩家移动30秒内自行获得奖励,敌人碰不到奖励代码
时间: 2024-10-11 15:13:52 浏览: 22
Unity2D坦克大战游戏中的玩家移动并获得奖励通常涉及游戏逻辑和碰撞检测。以下是简化的伪代码示例,展示如何实现这个功能:
```csharp
using UnityEngine;
using System.Collections;
public class TankPlayerController : MonoBehaviour
{
public float rewardTimeThreshold = 30f; // 奖励获取时间限制
private bool isRewardCollected = false; // 标记是否已收集过奖励
void Update()
{
// 玩家移动逻辑
Vector3 movementDirection = Input.GetAxis("Horizontal") * moveSpeed + Input.GetAxis("Vertical") * moveSpeed;
transform.position += movementDirection;
// 检测与奖励箱的碰撞
Collider2D[] colliders = Physics2D.OverlapCircle(transform.position, detectionRadius);
foreach (Collider2D collider in colliders)
{
if (!collider.CompareTag("Enemy") && !isRewardCollected) // 如果不是敌人且未收集过奖励
{
// 领取奖励
isRewardCollected = true;
Invoke("ResetRewardTimer", rewardTimeThreshold); // 设置延时回调以防止重复领取
}
}
// 如果超过30秒仍未触发碰撞,则自动发放奖励
if (isRewardCollected && Time.timeSinceLevelLoad > rewardTimeThreshold)
{
GiveReward(); // 自动发放奖励函数
}
}
void ResetRewardTimer() // 用于延迟领取奖励
{
InvokeRepeating("ResetRewardCheck", 1f, 1f);
}
void ResetRewardCheck()
{
if (Time.timeSinceLevelLoad > rewardTimeThreshold)
{
CancelInvoke("ResetRewardCheck");
isRewardCollected = false; // 重置标志
}
}
void GiveReward() // 实际奖励发放逻辑,如增加分数、解锁新能力等
{
// ...
}
}
```
在这个例子中,`Update()`方法会检查玩家的移动方向并与场景中的奖励箱进行碰撞检测。当满足条件时(即非敌人碰撞,且未领取过),玩家将标记为已领取,并设置一个定时器来防止重复领取。如果超过30秒依然没有再次获得奖励的机会,函数`GiveReward()`会被调用,完成奖励的发放。
阅读全文