查看: 541|回复: 0
打印 上一主题 下一主题

[其他] 在Terrain上沿直线均匀生成树木

[复制链接]

9903

主题

126

听众

7万

积分

首席设计师

Rank: 8Rank: 8

纳金币
53488
精华
316

最佳新人 热心会员 灌水之王 活跃会员 突出贡献 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2016-5-30 00:42:19 |只看该作者 |倒序浏览

使用方法,把代码拖到一个gameobject,设置下代码里的tag,运行,然后在场景里拖就ok了
treeNum为树的索引
  1. using UnityEngine;
  2. using System.Collections;
  3. public class TreePlanter : MonoBehaviour {
  4.         public Terrain t;
  5.         private TerrainData _tData;
  6.         private float _width;
  7.         private float _height;
  8.         public float dis = 1f;
  9.         private Vector3 _startPos;
  10.         private Vector3 _endPos;
  11.         public int treeNum = 0;
  12.         // Use this for initialization
  13.         void Start () {
  14.                 _tData = t.gameObject.GetComponent<TerrainCollider> ().terrainData;
  15.                 _width = _tData.size.x;
  16.                 _height = _tData.size.z;
  17.         }
  18.         public void AddTree(Vector3 pos)
  19.         {
  20.                 Vector3 finPos;
  21.                 pos = t.transform.InverseTransformPoint(pos);
  22.                 finPos = new Vector3 (pos.x/_width,0f,pos.z/_height);
  23.                 TreeInstance tree = new TreeInstance();
  24.                 tree.position = finPos;//TreePlanter.Instance.start.transform.localPosition;
  25.                 tree.heightScale = 1;
  26.                 tree.widthScale = 1;
  27.                 tree.prototypeIndex = treeNum;
  28.                 tree.color = Color.white;
  29.                 tree.lightmapColor = Color.white;
  30.                 t.AddTreeInstance (tree);
  31.                 t.Flush ();
  32.         }

  33.        
  34.         // Update is called once per frame
  35.         void Update () {
  36.                 if (Input.GetMouseButtonDown (0)) {
  37.                         Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
  38.                         RaycastHit hit;
  39.                         Physics.Raycast (ray, out hit, 1000, 1 << LayerMask.NameToLayer ("Terr"));
  40.                         _startPos = hit.point;
  41.                 }
  42.                 if (Input.GetMouseButtonUp (0)) {
  43.                         Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
  44.                         RaycastHit hit;
  45.                         Physics.Raycast (ray, out hit, 1000, 1 << LayerMask.NameToLayer ("Terr"));
  46.                         if (hit.collider == null)
  47.                                 return;
  48.                         _endPos = hit.point;
  49.                         CreatTreeLine ();
  50.                 }
  51.         }
  52.         public void CreatTreeLine()
  53.         {
  54.                 Vector3 dir;
  55.                 Vector3 pos = _startPos;
  56.                 float seDis = Dis2 (_startPos, _endPos);
  57.                 dir = _endPos - _startPos;
  58.                 dir.Normalize ();
  59.                 do {
  60.                         AddTree(pos);
  61.                         pos+=dir*dis;

  62.                 } while (Dis2(_startPos,pos)<seDis);
  63.         }
  64.         public float Dis2(Vector3 a,Vector3 b)
  65.         {
  66.                 return Mathf.Pow (a.x - b.x, 2f) + Mathf.Pow (a.z-b.z,2f);
  67.         }
  68. }
复制代码
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-8-18 09:29 , Processed in 0.265758 second(s), 29 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部