概述
系列文章目录
目录
系列文章目录
前言
给所有的Joint挂载物体
1.在ui编辑器上增添按钮
2.在add方法下书写逻辑
3. 创建一个预制体,指定addboj
4.总代码
总结
遇到的问题
前言
p10给所有的Joint挂载物体
给所有的Joint挂载物体
1.在ui编辑器上增添按钮
创建一个脚本AddToJoint,挂载到一个空物体上。在uinty面板上添加一个按钮,需要我们继承自一个脚本unity.editor,创建一个新的类,引用unity.editor。
使用override重写editor里面的一个方法,GUI:
使用GUILayot.Button()生成按钮,传递一个string按钮生成的名字,button返回布尔值
加一个标签,传入typeof(AddToJoint)脚本:
[CustomEditor(typeof(AddObjToJoint))]
判断是否点击,输出一句话000
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
if (GUILayout.Button("挂载物体到所有的关节下"))
{
Debug.Log("000");
}
}
点击时执行一个方法,将其挂载到joint下,封装至AddToJoint类里面,使用target访问不到add方法,因为target是一个object类型,所以我们需要将其强转成addobjtojoint这个类,强转之后调用add方法,然后输出。
if (GUILayout.Button("挂载物体到所有的关节下"))
{
(target as AddObjToJoint).Add();
}
public void Add()
{
print("12323223");
}
输出:
2.在add方法下书写逻辑
1.首先挂载物体,public一个变量gameobject,既需要挂载的物体。通过foreach遍历当前物体下的两个子物体,使用transform。输出一下item.name,点击后就会出现子物体的名字。
子物体:
public GameObject addObj;
public void Add()
{
foreach (Transform item in transform)
{
print(item.name);
}
}
2.另一种方式:通过for循环遍历,长度为transform.childcount(物体子对象的数目),都可以遍历到每一个子物体。
for (int i = 0; i < transform.childcount; i++)
{
print(transform.GetChild(i).name);
}
输出:
3.通过一个方法查找到每一个子物体关节点,查找transform组件。
Transform组件用于控制游戏对象在Unity场景中的位置、旋转和大小比例,每一个游戏对象都包含一个Transform组件,即便创建了一个空物体,它也有Transform组件。
foreach (var child in GetComponentsInChildren<Transform>())
{
print(child);//child代表所有的子物体
}
4.实例化,将addobj传入进去,父类为child
if (child == item) continue;//continue跳出自身循环,执行下一次循环
instantiate(addObj, child);//实例化,将addobj传入进去,父类为child
3. 创建一个预制体,指定addboj
多次点击后,需要销毁上一次的,所以保存一下实例化的物体:
public List<GameObiect> addList = new List<GameObiect>();
foreach (var item in addList)
{
DestroyImmediate(item);
}
addList.Clear();//遍历后销毁
4.总代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class AddObjToJoint : MonoBehaviour
{
public GameObject addObj;//挂载的预制体
public List<GameObject> addList = new List<GameObject>();
public void Add()
{
foreach (var item in addList)
{
DestroyImmediate(item);
}
addList.Clear();//遍历后销毁
foreach (Transform item in transform)
{
//item是每个子物体,会包含自身,所以需要将其排除一下
foreach (var child in item.GetComponentsInChildren<Transform>())
{
if (child == item) continue;//continue跳出自身循环,执行下一次循环
//Instantiate(addObj, child);//实例化,将addobj传入进去,父类为child
GameObject temp = Instantiate(addObj, child);//接收挂载物体
addList.Add(temp);
// print(child);//child代表所有的子物体
}
}
//for (int i = 0; i < transform.childcount; i++)
//{
// print(transform.GetChild(i).name);
//}
//transform.childCount物体的(变换组件的)子对象的数目(不包括自身)
}
}
//加一个标签,传入typeof(AddToJoint)脚本
[CustomEditor(typeof(AddObjToJoint))]
//在uinty面板上添加一个按钮,需要我们继承自一个脚本unity.editor,创建一个新的类,引用unity.editor。
public class AddObjToJointEditor : Editor
{//使用override重写editor里面的一个方法,GUI:
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
if (GUILayout.Button("挂载物体到所有的关节下")) //使用GUILayot.Button()生成按钮,传递一个string按钮生成的名字,button返回布尔值
{
(target as AddObjToJoint).Add();
}
}
}
总结
遇到的问题
1.Multi-Object editing not supported
以Editor命名的文件夹允许其中的脚本访问Unity Editor的API。如果脚本中使用了在UnityEditor命名空间中的类或方法,它必须被放在名为Editor的文件夹中。Editor文件夹中的脚本不会在build时被包含。
在项目中可以有多个Editor文件夹。
原文链接:https://blog.csdn.net/lihuozhiling0101/article/details/41958951
但是依旧没有解决,最后的解决方法:建立一个新的文件夹Editor,然后将脚本放进去,最后重新放回原文件夹,问题解决
最后
以上就是曾经汉堡为你收集整理的Leap Motion 基础开发学习之路(二)系列文章目录前言给所有的Joint挂载物体总结的全部内容,希望文章能够帮你解决Leap Motion 基础开发学习之路(二)系列文章目录前言给所有的Joint挂载物体总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复