This commit is contained in:
2026-06-14 19:07:11 +08:00
parent 2bb229f418
commit 140b1e9fe3
16 changed files with 407 additions and 131 deletions
@@ -6,8 +6,6 @@ using System.Collections.Generic;
using System.Text;
using UnityEngine;
public class BullitMove : MonoBehaviour
{
public string userid;
@@ -22,14 +20,20 @@ public class BullitMove : MonoBehaviour
MonsterContral target;
public Transform targetTra;
public string bulletID;
// Start is called before the first frame update
// 转向参数
public float maxTurnSpeed = 15f; // 最大转向速度(度/秒)
public float minTurnSpeed = 2f; // 最小转向速度
public float distanceForMaxTurn = 1f; // 在此距离内达到最大转向速度
public float hitDistance = 0.5f; // 命中判定距离
void Awake()
{
Init();
//Destroy(gameObject, desTime);
}
bool isLock = false;
public void Lock(MonsterContral monsterContral,Transform endTra)
public void Lock(MonsterContral monsterContral, Transform endTra)
{
foreach (var item in GetComponents<Collider2D>())
{
@@ -39,6 +43,7 @@ public class BullitMove : MonoBehaviour
target = monsterContral;
targetTra = endTra;
}
public void NotLock()
{
foreach (var item in GetComponents<Collider2D>())
@@ -47,64 +52,65 @@ public class BullitMove : MonoBehaviour
}
isLock = false;
target = null;
targetTra = null;
}
/// <summary>
/// 对象池用
/// </summary>
public void Init()
{
vector3_startPosition = transform.position;
vector3_startPosition.z = -400;
transform.position = vector3_startPosition;
}
//子弹同步分为两种一种是锁定目标一种是不锁定目标
// Update is called once per frame
float ABdistanceTemp=999999999;
public float a = 0.1f;
void Update()
{
if (isLock)
{
// 目标已被销毁或失效 → 解除锁定,变为普通子弹
// 目标无效 → 解除锁定
if (target == null || targetTra == null || !target.gameObject.activeInHierarchy || !targetTra.gameObject.activeInHierarchy)
{
NotLock();
return;
}
Vector3 v3bullet = transform.position;
v3bullet.z = 0;
Vector3 v3target = targetTra.transform.position;
v3target.z = 0;
var ABdistance = Vector3.Distance(v3bullet, v3target);
var rotateSpeed = 1/(ABdistance/3);
Vector3 targetPoint = (targetTra.transform.position-transform.position).normalized * moveSpeed*Time.deltaTime;
targetPoint.z = transform.position.z;
//transform.up = Vector2.Lerp(transform.up, targetPoint, rotateSpeed);
transform.up = Vector2.Lerp(transform.up, targetPoint, a);
targetPoint = transform.up.normalized * moveSpeed * Time.deltaTime;
targetPoint.z = 0;
transform.position+= targetPoint;
//if (ABdistance <= 2)
if (ABdistance > ABdistanceTemp)
Vector3 myPos = transform.position;
myPos.z = 0;
Vector3 targetPos = targetTra.position;
targetPos.z = 0;
float distance = Vector3.Distance(myPos, targetPos);
// 命中判定
if (distance <= hitDistance)
{
AttackFish(target);
return;
}
ABdistanceTemp = ABdistance;
// 计算指向目标的方向
Vector3 targetDir = (targetPos - myPos).normalized;
// 根据距离动态计算转向速度:距离越近转向越快
float t = Mathf.Clamp01(1f - (distance / distanceForMaxTurn));
float turnSpeed = Mathf.Lerp(minTurnSpeed, maxTurnSpeed, t);
// 使用 RotateTowards 平滑转向(角度/秒)
float currentAngle = Vector2.SignedAngle(transform.up, targetDir);
float newAngle = Mathf.MoveTowardsAngle(currentAngle, 0f, turnSpeed * Time.deltaTime);
transform.up = Quaternion.Euler(0, 0, newAngle) * transform.up;
// 沿当前方向移动
transform.position += transform.up * moveSpeed * Time.deltaTime;
}
else
{
//方便帧同步
// 非锁定模式:保持原有直线 + 反弹逻辑(不变)
currShowTime += Time.deltaTime;
Vector3 targetPoint = transform.up.normalized * currShowTime * moveSpeed;
targetPoint.z = 0;
transform.position = vector3_startPosition + targetPoint;
}
}
private void OnCollisionEnter2D(Collision2D collision)
{
if (isTriggerFirst)
@@ -112,13 +118,11 @@ public class BullitMove : MonoBehaviour
if (collision.transform.tag == "Fish")
{
isTriggerFirst = false;
//击中特效
if (effectPrefab != null)
{
Instantiate(effectPrefab, transform.position, Quaternion.identity, transform.parent);
}
// 只有子弹所属的本地玩家才处理怪物
if (userid == GameManager.Instance.user.id)
{
var monster = collision.transform.GetComponentInParent<MonsterContral>();
@@ -126,22 +130,21 @@ public class BullitMove : MonoBehaviour
Destroy(monster.gameObject);
}
Destroy(gameObject);
}
}
}
public static Quaternion RotationFromVector2(Vector2 dir)
{
float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
return Quaternion.Euler(0, 0, angle);
}
// 计算反射角度
Vector2 GetReflectionAngle(Vector2 velocity, Vector2 normal)
{
// 反射向量
return Vector2.Reflect(velocity.normalized, normal.normalized);
}
public void OnTriggerEnter2D(Collider2D collision)
{
if (isTriggerFirst)
@@ -150,9 +153,7 @@ public class BullitMove : MonoBehaviour
{
isTriggerFirst = false;
var monster = collision.transform.GetComponentInParent<MonsterContral>();
AttackFish(monster);
}
else if (collision.tag == "Wall")
{
@@ -160,7 +161,7 @@ public class BullitMove : MonoBehaviour
switch (collision.name)
{
case "up":
v3.z = -v3.z+180;
v3.z = -v3.z + 180;
break;
case "down":
v3.z = -v3.z + 180;
@@ -172,55 +173,29 @@ public class BullitMove : MonoBehaviour
v3.z = -v3.z;
break;
default:
break;
}
vector3_startPosition = transform.position;
currShowTime = 0;
transform.eulerAngles = v3;
}
}
}
private void AttackFish(MonsterContral monster)
{
//击中特效
if (effectPrefab != null)
{
Instantiate(effectPrefab, transform.position, Quaternion.identity, transform.parent);
}
// 只有子弹所属的本地玩家才向服务器发送 KillFish,其他人只播放特效
if (userid == GameManager.Instance.user.id)
{
var v2 = GameManager.Instance.gameData.currRoomData;
WebSocketSendList.KillFish(v2.roomId, userid, monster.monsterData.fishTypeConfig.fishNumber, monster.guid, (int)CreateFishManager.Instance.currGameType.currSitData.consumeGoldNum, bulletID, "63215f0afa3f5b25");
}
//受激
//受激
//monster.monsterData.charactersHealth.OnHurt(10, CharacterHurtType.none);
//monster.HP--;
//if (monster.HP == 0)
//{
// Instantiate(monster.effect_Die == null ? diePrefab : monster.effect_Die, monster.transform.position, Quaternion.identity, transform.parent);
// Destroy(monster.gameObject);
//}
//else
//{
monster.OnHurt();
//}
Destroy(gameObject);
}
}
}