> 文章列表 > unity--半圆包围posiotion

unity--半圆包围posiotion

unity--半圆包围posiotion

using UnityEngine;
using System.Collections;public class NewMonoBehaviour : MonoBehaviour
{public int[] shipLevels; // 战舰等级数组public float radius; // 半圆包围阵型半径private Vector3[] attackPositions; // 攻击位置数组void Start(){// 初始化攻击位置数组attackPositions = new Vector3[shipLevels.Length];// 计算每个战舰的攻击位置for (int i = 0; i < shipLevels.Length; i++){float angle = 360f * i / shipLevels.Length;float distance = GetAttackDistance(shipLevels[i]);Vector3 position = Quaternion.Euler(0f, angle, 0f) * Vector3.forward * distance;attackPositions[i] = position;}// 将攻击位置数组转换为世界坐标系for (int i = 0; i < attackPositions.Length; i++){attackPositions[i] = transform.position + attackPositions[i];}// 在半圆上均匀分布攻击位置Vector3 center = transform.position;//Vector3 direction = Vector3.forward;int count = attackPositions.Length;for (int i = 0; i < count; i++){float angle = i * Mathf.PI / count;float x = Mathf.Cos(angle);float z = Mathf.Sin(angle);Vector3 position = center + new Vector3(x, 0f, z) * radius;Vector3 toTarget = position - center;Vector3 toRotation = Vector3.forward;float rotationAngle = Vector3.Angle(toRotation, toTarget);Vector3 cross = Vector3.Cross(toRotation, toTarget);if (cross.y < 0){rotationAngle = -rotationAngle;}Quaternion rotation = Quaternion.Euler(0f, rotationAngle, 0f);attackPositions[i] = position + rotation * attackPositions[i];}}float GetAttackDistance(int shipLevel){switch (shipLevel){case 1:return 10f;case 2:case 3:case 4:return 12f;case 5:case 6:return 14f;case 7:case 8:return 16f;default:return 0f;}}}

网站制作教程网