unity 模型沿地表移动工具

让模型在地表移动,
目录结构
/assets/editor



using UnityEngine;
using UnityEditor;
using System.Collections;
/// <summary>
/// 模型拖动器
/// 1. 地表.
/// 2. 地图表面.
/// </summary>
public class ModelDragger : EditorWindow
{
static readonly string INTRODUCE = "让模型沿地表移动.\n"
+"沿地表:模型的高度为当前地形高度.\n"
+"沿地图:模型高度为,从上面开始.第一个接触到模型的高度";

static readonly string MY_NAME = "模型拖动器";
static readonly string ALONG_TERRAIN = "沿地表拖动:";
static readonly string ALONG_MAP = "沿地图拖动:";
static readonly string ON = "开";
static readonly string OFF = "关";
static readonly string CANT_MOVE_TERRAIN = "地形,不能移动.";

private bool isTerrain;
private bool isMap;
private Terrain curTerrain;

[MenuItem("Level4/Fbx/ModelDragger")]
static void Init()
{
ModelDragger md = EditorWindow.GetWindow<ModelDragger>(false, MY_NAME) as ModelDragger;
md.curTerrain = Terrain.activeTerrain;
}

void OnGUI()
{
GUILayout.Label(INTRODUCE);
//地表
EditorGUILayout.BeginHorizontal("box");
EditorGUILayout.PrefixLabel(ALONG_TERRAIN);
isTerrain = GUILayout.Toggle(isTerrain, isTerrain ? OFF : ON);
if (isTerrain)
isMap = false;
EditorGUILayout.EndHorizontal();
//地图
EditorGUILayout.BeginHorizontal("box");
EditorGUILayout.PrefixLabel(ALONG_MAP);
isMap = GUILayout.Toggle(isMap, isMap ? OFF : ON);
if (isMap)
isTerrain = false;
EditorGUILayout.EndHorizontal();
}
void Update()
{
if (isTerrain)
{
DragAlongTerrain();
}
else if (isMap)
{
DragAlongMap();
}
}
/// <summary>
/// 模型沿地表移动
/// </summary>
void DragAlongTerrain()
{
if (curTerrain != null)
{
foreach (Transform tr in Selection.transforms)
{
if (tr.GetComponent<Terrain>() == null)
tr.position = new Vector3(tr.position.x, curTerrain.SampleHeight(tr.position), tr.position.z);
else
{
ShowNotification(new GUIContent(CANT_MOVE_TERRAIN));
break;
}
}
}
}
/// <summary>
/// 模型沿地图移动.
/// </summary>
void DragAlongMap()
{
foreach (Transform tr in Selection.transforms)
{
if (tr.GetComponent<Terrain>() == null)
FallIt(tr);
else
{
ShowNotification(new GUIContent(CANT_MOVE_TERRAIN));
break;
}
}
}
/// <summary>
/// 物体 向下掉落.
/// </summary>
/// <param name="tr"></param>
void FallIt(Transform tr)
{
Vector3 origin = tr.position;
origin.y += 1000;
Vector3 dir = Vector3.down;
RaycastHit[] hits = Physics.RaycastAll(origin, dir);
Debug.DrawRay(origin,dir*100,Color.red);

foreach (RaycastHit hit in hits)
{
if (hit.transform != tr)
{
tr.position = hit.point;
break;
}
}
}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gamebox1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值