ARCar项目第二节课应完成代码

各位对项目感兴趣的看官请移步,这里没有各位需要的代码,本内容仅做阶段记录用。

基类PrimitiveBase

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
 * #AuthorName#
 * #UpdateTime#
 */
//要求组件
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
[ExecuteInEditMode]
public class PrimitiveBase : MonoBehaviour {
    //定义平面的初始化位置
    public Vector3 offset;
    //MeshFilter
    protected MeshFilter meshFilter;
    //定义mesh网格的纹理坐标数组
    protected Vector2[] uvs;
    //定义mesh网格的三角形顶点索引数组
    protected int[] triangles;
    //定义mesh网格的顶点数据数组
    protected Vector3[] vertices;

    //唤醒
    private void Awake()
    {
        //创建对象其他相关属性
        Init();
    }
    void Init()
    {
        //需要对象的MeshFilter
        meshFilter = GetComponent();
        //需要对象空Mesh
        meshFilter.sharedMesh = new Mesh();
    }

    protected virtual void InitMesh() { }
    protected virtual void UpdateShape() { }

    protected void UpdateMesh()
    {
        if (meshFilter.sharedMesh == null)
        {
            meshFilter.sharedMesh = new Mesh();
        }
        meshFilter.sharedMesh.vertices = vertices;
        meshFilter.sharedMesh.triangles = triangles;
        meshFilter.sharedMesh.uv = uvs;
    }

    //当面板内容改动时,就会自动调用这个方法
    private void OnValidate()
    {
        InitMesh();
    }
}

矩形线条RectMesh

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
 * #AuthorName#
 * #UpdateTime#
 */

public class RectMesh : PrimitiveBase
{
    
    //定义平面的宽和长
    public float m_Width;
    public float m_Length;
    
    //锚点类型枚举
    public enum PirotAlign
    {
        Left,
        Center,
        Right
    }
    //初始化锚点
    public PirotAlign widthAlign = PirotAlign.Center;
    public PirotAlign lengthAlign = PirotAlign.Center;

    //创建Mesh
    protected override void InitMesh()
    {
        uvs = new Vector2[4];
        uvs[0].x = 0;
        uvs[0].y = 0;
        uvs[1].x = 1;
        uvs[1].y = 0;
        uvs[2].x = 0;
        uvs[2].y = 1;
        uvs[3].x = 1;
        uvs[3].y = 1;

        triangles = new int[] { 0, 2, 3, 0, 3, 1 };

        UpdateShape();
    }

    protected override void UpdateShape()
    {
        vertices = new Vector3[4];
        Vector3 localPos = offset;
        float w2 = m_Width * 0.5f;
        float l2 = m_Length * 0.5f;

        switch (widthAlign)
        {
            case PirotAlign.Left:
                vertices[0].x = localPos.x;
                vertices[1].x = localPos.x + w2;
                vertices[2].x = localPos.x;
                vertices[3].x = localPos.x + w2;
                break;
            case PirotAlign.Center:
                vertices[0].x = localPos.x - w2;
                vertices[1].x = localPos.x + w2;
                vertices[2].x = localPos.x - w2;
                vertices[3].x = localPos.x + w2;
                break;
            case PirotAlign.Right:
                vertices[0].x = localPos.x - w2;
                vertices[1].x = localPos.x ;
                vertices[2].x = localPos.x - w2;
                vertices[3].x = localPos.x ;
                break;
        }

        switch (lengthAlign)
        {
            case PirotAlign.Left:
                vertices[0].z = localPos.z;
                vertices[1].z = localPos.z;
                vertices[2].z = localPos.z + l2;
                vertices[3].z = localPos.z + l2;
                break;
            case PirotAlign.Center:
                vertices[0].z = localPos.z - l2;
                vertices[1].z = localPos.z - l2;
                vertices[2].z = localPos.z + l2;
                vertices[3].z = localPos.z + l2;
                break;
            case PirotAlign.Right:
                vertices[0].z = localPos.z - l2;
                vertices[1].z = localPos.z - l2;
                vertices[2].z = localPos.z;
                vertices[3].z = localPos.z;
                break;
        }
        
        vertices[0].y = vertices[1].y = vertices[2].y = vertices[3].y = localPos.y;

        UpdateMesh();
    }
}

弧形线条

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
 * #AuthorName#
 * #UpdateTime#
 */
/// 
/// 我们在这里先设计圆环的mesh,注意继承PrimitiveBase
/// 
public class RingMesh : PrimitiveBase {
    //我们先来看绘制的基本概念,我们想要的是圆环,首先要确定分割面
    public int segment = 1;
    //创建Mesh
    protected override void InitMesh()
    {
        //确保分割面数量大于0
        segment = segment > 0 ? segment : 1;
        //然后是uv顶点
        //如果是我们刚才的分割方式,应该有多少顶点,分割面数
        int vertexCount = segment * 2 + 2;
        uvs = new Vector2[vertexCount];
        //然后是顶点二维坐标
        //假设我们分割了segment数量的面,那么我们的uv顶点如下
        float singleUV = 1f / segment;
        float uvY = 0f;
        for (int i = 0; i < vertexCount; i+=2)
        {
            uvs[i].x = 0f;
            uvs[i + 1].x = 0f;
            uvs[i].y = uvY;
            uvs[i+1].y = uvY;
            uvY += singleUV;
        }


        //然后是三角形顶点
        //从矩形思考triangles = new int[] { 0, 2, 3, 0, 3, 1 };
        triangles = new int[segment * 2 * 3];
        //我们需要创建若干顶点序列
        for (int i = 0; i < segment; i++)
        {
            int k = i * 6;
            int j = i * 2;
            triangles[k] = j;
            triangles[k+1] = j + 2;
            triangles[k+2] = j + 3;
            triangles[k+3] = j;
            triangles[k+4] = j + 3;
            triangles[k+5] = j + 1;
        }
        UpdateShape();
    }

你可能感兴趣的:(ARCar项目第二节课应完成代码)