当前位置: 首页 > article >正文

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;
        }
    }

}


http://www.kler.cn/a/9503.html

相关文章:

  • androidstudio下载gradle慢
  • Zotero 6.0 安装包及安装教程
  • 2024-11-13 学习人工智能的Day26 sklearn(2)
  • 45.第二阶段x86游戏实战2-hook监控实时抓取游戏lua
  • MySQL重难点(一)索引
  • 【数据结构与算法】第11课—数据结构之选择排序和交换排序
  • springboot+jwt令牌简单登录案例
  • 【校招VIP】南邮的计算机研究生面试,竟然说开发岗只是增删改查,而且项目QPS并发量数量过于吓人
  • Spring Security 6 的权限授权验证失败
  • node开通阿里云短信验证服务,代码演示 超级详细
  • 浅谈全局视角下的设计模式
  • VIM 编辑器使用教程
  • CMake入门教程【基础篇】4.target_include_directories包含指定文件夹头文件
  • 基于5G技术的智能导航机器人及AR巡逻应用开发项目实施方案(上)
  • linux 集群时间同步
  • 前端动态路由(前端控制全部路由,用户角色由后端返回)
  • 使用Docker快速创建一个Jenkins服务
  • 长文理解以太坊虚拟机
  • Android双目三维重建:Android双目摄像头实现双目测距
  • 走迷宫问题
  • 编写开发API接口
  • Halcon: (示例 1)OCR 字符识别
  • 【Pycharm基础运用】涵盖pycharm的常用功能
  • 初识设计模式 - 备忘录模式
  • 面试官灵魂拷问:为什么 SQL 语句不要过多的 join?
  • MyBatis-Plus的基本操作