当前位置: 首页 > 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

相关文章:

  • react 受控组件和非受控组件
  • u盘加密软件有哪些?2025年必备的u盘加密神器分享(共6款!提前布局!)
  • 实验5:网络设备发现、管理和维护
  • llama factory lora 微调 qwen2.5 7B Instruct模型
  • Servlet入门 Servlet生命周期 Servlet体系结构
  • 【QT常用技术讲解】优化网络链接不上导致qt、qml界面卡顿的问题
  • 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