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

Unity 中使用 C# 对 Vector2 向量朝向进行顺时针排序及复杂排序场景处理

        在 Unity 开发中,我们经常会遇到需要对数据进行排序的情况。本文将介绍如何在 Unity 环境下使用 C# 对以Vector2表示的向量的朝向按照顺时针排序,以及当OrderBy内的内容比较复杂时的处理方法。

一、对 Vector2 向量朝向进行顺时针排序

        以下是在 Unity 环境下使用 C# 对以Vector2表示的向量的朝向按照顺时针排序的代码:

using System.Collections.Generic;
using UnityEngine;

public class VectorSorter : MonoBehaviour
{
    public List<Vector2> vectors;

    void Start()
    {
        List<Vector2> sortedVectors = SortVectorsClockwise(vectors);
        foreach (var vector in sortedVectors)
        {
            Debug.Log($"Sorted Vector: ({vector.x}, {vector.y})");
        }
    }

    List<Vector2> SortVectorsClockwise(List<Vector2> inputVectors)
    {
        return inputVectors.OrderBy(vector => Mathf.Atan2(vector.y, vector.x)).ToList();
    }
}

        在这个脚本中,定义了一个SortVectorsClockwise方法,它使用OrderBy方法根据向量与水平向右参考向量的夹角(通过Mathf.Atan2计算)对二维向量列表进行排序。在Start方法中,调用这个排序方法并输出排序后的结果。

        请注意,确保将这个脚本挂载到一个游戏对象上,并将需要排序的向量列表赋值给vectors变量。

二、处理复杂的OrderBy内容 

        当OrderBy内的内容比较复杂时,可以通过以下几种方式来处理。

 1. 使用多个键进行排序

         如果需要根据多个属性进行排序,可以在OrderBy之后使用ThenBy方法依次指定多个排序键。

        例如,假设有一个自定义的结构体MyStruct,包含Property1Property2两个属性,要先按照Property1升序排序,如果Property1相同再按照Property2降序排序,可以这样写:

struct MyStruct
{
    public int Property1;
    public int Property2;
}

List<MyStruct> myList = new List<MyStruct>();
// 添加一些元素到列表

var sortedList = myList.OrderBy(item => item.Property1).ThenByDescending(item => item.Property2).ToList();

 2. 使用自定义比较器

        可以创建一个自定义的比较器类来实现复杂的排序逻辑。这个比较器类需要实现IComparer<T>接口,并重写Compare方法。 

class MyCustomComparer : IComparer<MyStruct>
{
    public int Compare(MyStruct x, MyStruct y)
    {
        // 复杂的比较逻辑
        if (x.Property1 < y.Property1) return -1;
        if (x.Property1 > y.Property1) return 1;
        if (x.Property2 < y.Property2) return -1;
        if (x.Property2 > y.Property2) return 1;
        return 0;
    }
}

List<MyStruct> myList = new List<MyStruct>();
// 添加一些元素到列表

var sortedList = myList.OrderBy(item => item, new MyCustomComparer()).ToList();

 3. 使用匿名函数或 lambda 表达式进行复杂计算

        如果排序依据需要进行复杂的计算,可以在 lambda 表达式中编写这些计算逻辑。

        例如,假设有一个包含Vector2的列表,要根据向量的长度和与某个特定向量的夹角进行排序:

List<Vector2> vectorList = new List<Vector2>();
// 添加一些向量到列表

Vector2 referenceVector = new Vector2(1, 0);

var sortedList = vectorList.OrderBy(v =>
{
    float length = v.magnitude;
    float angle = Vector2.Angle(referenceVector, v);
    return new { Length = length, Angle = angle };
}).ToList();

        在这个例子中,lambda 表达式中计算了向量的长度和与参考向量的夹角,并将它们组合成一个匿名对象,然后根据这个匿名对象进行排序。

        这里需要补充一点儿的是,不管是List.OrderBy还是List.ThenBy都是按照升序进行排序的,如果要进行降序排序,请使用OrderByDescending或者List.ThenByDescending。

        通过以上方法,我们可以在 Unity 中灵活地处理对Vector2向量朝向的排序以及应对复杂的排序场景,提高开发效率。


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

相关文章:

  • 计算机图形学知识点汇总
  • C++ 指针进阶:动态内存与复杂应用
  • EasyGBS国标GB28181公网平台P2P远程访问故障诊断:云端服务端排查指南
  • GTID下复制问题和解决
  • SDMTSP:黑翅鸢算法(Black-winged kite algorithm,BKA)求解单仓库多旅行商问题,可以更改数据集和起点(MATLAB代码)
  • 【项目实战】NGINX 实现会话保持
  • Leetcode 存在重复元素II
  • 深入探索:Scrapy深度爬取策略与实践
  • Linux(文件特殊属性 + FACL 图片+大白话)
  • 机器学习基础04
  • Java项目实战II基于微信小程序的实习记录(开发文档+数据库+源码)
  • Unity3D 制作MMORPG 3D地图编辑器详解
  • FBX福币交易所恒指收跌1.96% 半导体股继续回调
  • SpringBoot整合Freemarker(四)
  • ‘nodemon‘ 不是内部或外部命令,也不是可运行的程序
  • Rollup failed to resolve import “destr“ from ***/node_modules/pinia-plugin-pers
  • Jmeter基础篇(23)TPS和QPS的异同
  • android bootchart安装使用指南
  • PHP Session
  • qt QFrame详解
  • 企望制造ERP drawGrid.action 接口SQL注入漏洞复现 [附POC]
  • 路径规划——RRT-Connect算法
  • Linux编辑/etc/fstab文件不当,不使用快照;进入救援模式
  • 后端一次性返回数据,前端分页
  • Window下PHP安装最新sg11(php5.3-php8.3)
  • BERT的中文问答系统30