纳金网
标题:
在Terrain上沿直线均匀生成树木
[打印本页]
作者:
烟雨
时间:
2016-5-30 00:42
标题:
在Terrain上沿直线均匀生成树木
使用方法,把代码拖到一个gameobject,设置下代码里的tag,运行,然后在场景里拖就ok了
treeNum为树的索引
using UnityEngine;
using System.Collections;
public class TreePlanter : MonoBehaviour {
public Terrain t;
private TerrainData _tData;
private float _width;
private float _height;
public float dis = 1f;
private Vector3 _startPos;
private Vector3 _endPos;
public int treeNum = 0;
// Use this for initialization
void Start () {
_tData = t.gameObject.GetComponent<TerrainCollider> ().terrainData;
_width = _tData.size.x;
_height = _tData.size.z;
}
public void AddTree(Vector3 pos)
{
Vector3 finPos;
pos = t.transform.InverseTransformPoint(pos);
finPos = new Vector3 (pos.x/_width,0f,pos.z/_height);
TreeInstance tree = new TreeInstance();
tree.position = finPos;//TreePlanter.Instance.start.transform.localPosition;
tree.heightScale = 1;
tree.widthScale = 1;
tree.prototypeIndex = treeNum;
tree.color = Color.white;
tree.lightmapColor = Color.white;
t.AddTreeInstance (tree);
t.Flush ();
}
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown (0)) {
Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
RaycastHit hit;
Physics.Raycast (ray, out hit, 1000, 1 << LayerMask.NameToLayer ("Terr"));
_startPos = hit.point;
}
if (Input.GetMouseButtonUp (0)) {
Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
RaycastHit hit;
Physics.Raycast (ray, out hit, 1000, 1 << LayerMask.NameToLayer ("Terr"));
if (hit.collider == null)
return;
_endPos = hit.point;
CreatTreeLine ();
}
}
public void CreatTreeLine()
{
Vector3 dir;
Vector3 pos = _startPos;
float seDis = Dis2 (_startPos, _endPos);
dir = _endPos - _startPos;
dir.Normalize ();
do {
AddTree(pos);
pos+=dir*dis;
} while (Dis2(_startPos,pos)<seDis);
}
public float Dis2(Vector3 a,Vector3 b)
{
return Mathf.Pow (a.x - b.x, 2f) + Mathf.Pow (a.z-b.z,2f);
}
}
复制代码
欢迎光临 纳金网 (http://go.narkii.com/club/)
Powered by Discuz! X2.5