Unity客户端开发中遇到的问题

1.如何获取一个List<中的一个泛型>?

详细描述:我想获取List的泛型类型,然后强转List里面的实例。
网上找了很久都没有找到相关的资料,不知道是不是因为我这个想法比较愚蠢,总之比较好奇能不能这么做。
然后就产生了相关的问题

class Human
{
    
    
    public virtual void Eat() {
    
     }
    public virtual void Sleep() {
    
     }
    public virtual void Study() {
    
     }
}
class Man : Human
{
    
    
    public void ManFun() {
    
     }
}
class Woman : Human
{
    
    
    public void WomanFun() {
    
     }
}
public class Test : MonoBehaviour
{
    
    
    List<Human> HumanList = new List<Human>();
    void Start()
    {
    
    
        HumanList.Add(new Man());
        HumanList.Add(new Woman());
        HumanList.Add(new Mid());
        Debug.Log($"HumanListType:{
      
      HumanList.GetType()}\n{
      
      HumanList[0].GetType()}\n{
      
      HumanList[1].GetType()}");
        var rType = HumanList[0].GetType().BaseType;
        Debug.Log(rType);
        Debug.Log(HumanList[2].GetType().BaseType);

    }
}

1.获取HumanList类型,当我们打印List的类型时:
结果为:HumanListType:System.Collections.Generic.List`1[Human]
距离我想得到的Human类型又更近了,我想知道这个Human里面的相关信息还要拿到Human这个类型
2.当HumanList被new出来并且该List中有元素时的做法
我当时就想到了获取到实例然后再获取其父类的类型
结果为:Human
但是:该方法有个弊端,List<>在规定泛型的时候肯定是以BaseType做为泛型,如果继承的链条太长,就会导致套娃!
3.当HumanList仅仅只是声明的状态时,如何获取其泛型的类型
此时GetType会报NoneReference。

2.AnimationClip的类型就是AnimationClip

3.接口Debug.DrawLine()若写在OnDrawGizmosSelected函数体内,在Hierarchy中选择其他GameObject时,这个Line不会及时消失。

class Test : MonoBehaviour
{
    
    
     void OnDrawGizmosSelected()
     {
    
    
             Debug.DrawLine(Vector3.zero,Vector3.up);//选中场景中的其他物体时,会导致刷新不及时该Line会一直存在
             //建议使用
             Gizmos.DrawLine(Vector3.zero,Vector3.up);//注意此时使用的是局部坐标(该坐标系的中心点是该Mono所挂物体的坐标)
     }
}

4.Gizmos.DrawLine 偏移量修正问题

在Unity中,经常会写到关卡编辑器,此时会需要一些数据可视化给策划,方便其使用,我在使用Gimzos.DrawLine时,发现如果动了场景中的挂点会导致线条不匹配。
说明:由三个Vector构成的三角形,但是在移动红色方块时,三角形会出现偏移。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

因为Gizmos.DrawLine是以局部坐标开始画的,此时已经转化了局部坐标的。

        for (int i = 1; i < this.PointList.Count; i++)
        {
    
    
            var Pos1 = this.transform.InverseTransformPoint(this.PointList[i]); 
            var Pos2 = this.transform.InverseTransformPoint(this.PointList[i-1]); 
            Gizmos.DrawLine(Pos1, Pos2);
            if (i == this.PointList.Count - 1)
            {
    
    
                Pos1 = this.transform.InverseTransformPoint(this.PointList[i]);
                Pos2 = this.transform.InverseTransformPoint(this.PointList[0]);
                Gizmos.DrawLine(Pos1, Pos2);
            }
        }

改良版本

        var rOffset = this.PointList[this.PointList.Count - 1] - this.transform.position;
        for (int i = 1; i < this.PointList.Count; i++)
        {
    
    
            var Pos1 = this.transform.InverseTransformPoint(this.PointList[i]) - rOffset;
            var Pos2 = this.transform.InverseTransformPoint(this.PointList[i - 1]) - rOffset;
            Gizmos.DrawLine(Pos1, Pos2);
            if (i == this.PointList.Count - 1)
            {
    
    
                Pos1 = this.transform.InverseTransformPoint(this.PointList[i]) - rOffset;
                Pos2 = this.transform.InverseTransformPoint(this.PointList[0]) - rOffset;
                Gizmos.DrawLine(Pos1, Pos2);
            }
        }

5.射线检测失效(正面有效反面失效问题):

在这里插入图片描述
这是个坑,意思就是三角面模型是有正反的。

猜你喜欢

转载自blog.csdn.net/weixin_43381316/article/details/124648869