首先,请允许我解释一下我所拥有的,然后再讨论下一个要解决的问题。
我有什么
我有一个带纹理的自定义网格物体,其某些边缘与Unity中的整数世界坐标完全对齐。在网格中,我添加了自己的粗糙但有效的自定义表面着色器,如下所示:
Shader "Custom/GridHighlightShader"
{
Properties
{
[HideInInspector]_SelectionColor("SelectionColor", Color) = (0.1,0.1,0.1,1)
[HideInInspector]_MovementColor("MovementColor", Color) = (0,0.205,1,1)
[HideInInspector]_AttackColor("AttackColor", Color) = (1,0,0,1)
[HideInInspector]_GlowInterval("_GlowInterval", float) = 1
_MainTex("Albedo (RGB)", 2D) = "white" {}
_Glossiness("Smoothness", Range(0,1)) = 0.5
_Metallic("Metallic", Range(0,1)) = 0.0
}
SubShader
{
Tags { "RenderType" = "Opaque" }
LOD 200
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows
// Use shader model 3.0 target, to get nicer looking lighting
#pragma …Run Code Online (Sandbox Code Playgroud) 我想知道如何在单击它们时在 Unity 中的网格中重新着色单个三角形。我下面的代码允许我检测点击在 3D 空间中的网格表面上的位置。从那里我尝试从网格中获取三角形索引并将颜色数组中的相应索引设置为红色。
但是,我可以看到我单击的位置(绿色立方体在图像中转换到的位置)甚至不接近三角形在网格上重新着色的位置。是否需要进行某种索引或坐标转换才能为光线投射/点击与网格碰撞的确切三角形着色?
我正在为图像中的球体使用标准的无光照着色器,有时会出现索引越界错误,这表明我在尝试将颜色数组设置为红色时超出了颜色数组的长度。
对此的任何帮助或见解将不胜感激。谢谢!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyRayDraw : MonoBehaviour
{
public GameObject cube;
private MeshRenderer meshRenderer;
Mesh mesh;
Vector3[] vertices;
Color[] colorArray;
private void Start()
{
mesh = transform.GetComponent<MeshFilter>().mesh;
vertices = mesh.vertices;
// create new colors array where the colors will be created
colorArray = new Color[vertices.Length];
for (int k = 0; k < vertices.Length; k++)
{
colorArray[k] = Color.white;
}
mesh.colors = colorArray;
}
void Update()
{
if (Input.GetMouseButtonDown(0)) …Run Code Online (Sandbox Code Playgroud) 我正在尝试在一个网格渲染器中使用多个重叠的图像层来制作 2D 游戏对象的动画。我有几层不同的纹理,每层都是具有透明背景的图像。
我找到了一种以编程方式创建矩形网格并使用 UV 映射对其中的材质进行分层的方法。不幸的是,Unity 现在必须单独渲染每个材质层,尽管它们都位于一个网格内。这会导致绘制调用的效率非常低。我可以看到每种材质现在也有自己的着色器。
我是否需要在 Unity 之外将所有图像编辑成一张巨大的图像,并在网格内的单一材质中使用 UV 映射来显示其中的一部分?
或者有什么方法可以通过着色器来实现这一点?
在 Unity 中尝试创建 apk 文件时,我遇到了以下错误。我正在运行 Windows 8 PC,并带有通过 USB 连接到计算机的全新华为 Honor 8 手机。连接我较旧的 Nexus 4 android 手机具有相同的结果:

我的 PC 的操作系统能够找到该设备,并且设备管理器中的驱动程序似乎是最新的:

但是,adb devices从命令提示符运行显示找不到任何内容。我也尝试重新启动 adb 服务器:

我尝试了设备本身的其他连接类型(PTP、MTP、仅充电等),但这对问题没有影响,即使在断开手机的 USB 电缆并将其重新连接到计算机之后:
我已经安装了 JDK 和 Android SDK。在 SDK 管理器中,我安装的文件如下所示:

在这一点上,我不知道我错过了什么,这可能很简单。
昨天,Stack Overflow上的其他人帮助我确定了如何通过单击将网格三角形重新着色为红色,效果很好,唯一的问题是,重新着色的3个顶点在三角形之间共享。这导致看起来很模糊的着色。我真的希望有一种方法可以只对一张脸进行着色(如果可以的话,可以正常着色)。
我已将以下脚本附加到我的网格,该脚本使用射线投射确定表面坐标并在那里平移绿色立方体。下面的gif可以更好地说明此问题。
再次感谢您对此的任何帮助或见解。谢谢!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyRayDraw : MonoBehaviour
{
public GameObject cube;
private MeshRenderer meshRenderer;
Mesh mesh;
Vector3[] vertices;
Color[] colorArray;
private void Start()
{
mesh = transform.GetComponent<MeshFilter>().mesh;
vertices = mesh.vertices;
colorArray = new Color[vertices.Length];
for (int k = 0; k < vertices.Length; k++)
{
colorArray[k] = Color.white;
}
mesh.colors = colorArray;
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out RaycastHit hit))
{
Snap(hit.point); // …Run Code Online (Sandbox Code Playgroud)