новая сцена:
- камера
- свет
- земля
к земле добавил стандартное дерево "пальму".
установил скрипты.
для камеры(вешаем на камеру)
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
/// <summary>
/// камера
/// </summary>
public class _Camera : MonoBehaviour
{
//камера
float rotationY = 0F;
float sensitivityX = 15F;
float sensitivityY = 15F;
float minimumY = -60F;
float maximumY = 60F;
//------------------------------------------------
// Use this for initialization
void Start()
{
} //------------------------------------------------
//гуи
void OnGUI()
{
if (Camera.mainCamera != null)
{
Transform pTransform = Camera.mainCamera.transform;
Vector3 pPos = pTransform.position;
GUI.Button(new Rect(10, 10, 200, 20), "Cam=" + pPos.ToString());
}
} //------------------------------------------------
// Update is called once per frame
void Update()
{
} //------------------------------------------------
//
void LateUpdate()
{
//управление камерой
_Management_Cam();
} //------------------------------------------------
//------------------------------------------------
//управление камерой
void _Management_Cam()
{
if (Camera.mainCamera == null)
return;
Transform pTransform = Camera.mainCamera.transform;
float pTrSpeed = 10;
float pRotSpeed = 35;
bool pbMouse = false;
float pd = Time.deltaTime;
float pTr_X = 0;
float pTr_Y = 0;
float pTr_Z = 0;
bool pbTr = false;
float pRot_X = 0;
float pRot_Y = 0;
float pRot_Z = 0;
bool pbRot = false;
if (Input.GetMouseButton(1))
{
pbMouse = true;
float rotationX = pTransform.localEulerAngles.y
+ Input.GetAxis("Mouse X") * sensitivityX;
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotationY = Mathf.Clamp(rotationY, minimumY, maximumY);
pTransform.localEulerAngles =
new Vector3(-rotationY, rotationX, 0);
}
//перемещение без изменения высоты
if (Input.GetMouseButton(2))
{
//Set_DrawTextInfo("Camera_Management_Mouse_2", 0);
pTr_Z += (pTrSpeed * pd);
pTr_X += (pTrSpeed * pd);
Vector3 pvF = pTransform.forward;
Vector3 pvPos = pTransform.position;
pTrSpeed *= 2;
pvPos.x += pvF.x * (pTrSpeed * pd);
pvPos.z += pvF.z * (pTrSpeed * pd);
pTransform.position = pvPos;
//pTransform.Translate(pTr_X, pTr_Y, pTr_Z);
return;
}
float pm = Input.GetAxis("Mouse ScrollWheel");
if (pm != 0)
{
pTransform.Translate(0, 0, pm * pTrSpeed);
pbMouse = true;
}
if (pbMouse)
{
//Set_DrawTextInfo("Camera_Management_Mouse", 0);
return;
}
//Set_DrawTextInfo("Camera_Management", 0);
//поворот лево-право
if (Input.GetKey(KeyCode.Keypad7))
{
pRot_Y += (-pRotSpeed * pd);
pbRot = true;
}
else
{
if (Input.GetKey(KeyCode.Keypad9))
{
pRot_Y += (pRotSpeed * pd);
pbRot = true;
}
}
//поворот вниз-вверх
if (Input.GetKey(KeyCode.Keypad1))
{
pRot_X += (pRotSpeed * pd);
pbRot = true;
}
else
{
if (Input.GetKey(KeyCode.Keypad2))
{
pRot_X += (-pRotSpeed * pd);
pbRot = true;
}
}
//поворот вбок лево-право
if (Input.GetKey(KeyCode.Keypad0))
{
pRot_Z += (pRotSpeed * pd);
pbRot = true;
}
else
{
if (Input.GetKey(KeyCode.Keypad3))
{
pRot_Z += (-pRotSpeed * pd);
pbRot = true;
}
}
if (pbRot)
{
pTransform.Rotate(pRot_X, pRot_Y, pRot_Z);
}
//вперёд-назад
if (Input.GetKey(KeyCode.Keypad8))
{
//Set_DrawTextInfo ("Camera_Keypad8", 0);
//pTransform.Translate(0,0,1 * pd);
pTr_Z += (pTrSpeed * pd);
pbTr = true;
}
else
{
if (Input.GetKey(KeyCode.Keypad5))
{
pTr_Z += (-pTrSpeed * pd);
pbTr = true;
}
}
//боком лево-право
if (Input.GetKey(KeyCode.Keypad6))
{
pTr_X += (pTrSpeed * pd);
pbTr = true;
}
else
{
if (Input.GetKey(KeyCode.Keypad4))
{
pTr_X += (-pTrSpeed * pd);
pbTr = true;
}
}
//вверх-вниз
if (Input.GetKey(KeyCode.KeypadPlus))
{
pTr_Y += (pTrSpeed * pd);
pbTr = true;
}
else
{
if (Input.GetKey(KeyCode.KeypadMinus))
{
pTr_Y += (-pTrSpeed * pd);
pbTr = true;
}
}
if (pbTr)
{
pTransform.Translate(pTr_X, pTr_Y, pTr_Z);
}
} //------------------------------------------------
} //------------------------------------------------
для деревьев(вешаем на землю)
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
/// <summary>
/// деревья
/// </summary>
public class _Tree : MonoBehaviour
{
// Use this for initialization
void Start()
{
//очистка деревьев
_TreeZero();
//рождение деревьев
_TreeCreate(0, new Vector3(10, -1, 10), Color.white, Color.white, 1, 1);
//рождение деревьев
_TreeCreate(0, new Vector3(1000, 100, 1000), Color.white, Color.white, 1, 1);
} //------------------------------------------------
// Update is called once per frame
void Update()
{
bool pbClick = false;
if (Input.GetKey(KeyCode.LeftShift))
{
if (Input.GetMouseButtonUp(0))
{
pbClick = true;
}
}
//
if (pbClick)
{
LayerMask pMask = 0;
float pRayLength = 100;
Ray pRay = Camera.mainCamera.ScreenPointToRay(Input.mousePosition);
int pLayer = F_Layer("Default");
pMask |= 1 << pLayer;
Vector3 pPosP = F_PointFocusMouse(pRay, pRayLength, pMask);
Debug.Log("+++ pPosP=" + pPosP.ToString());
if (pPosP != Vector3.zero)
{
//рождение деревьев
_TreeCreate(0, pPosP, Color.white, Color.white, 1, 1);
}
}
} //------------------------------------------------
//------------------------------------------------
//очистка деревьев
void _TreeZero()
{
Terrain pTerrain = Terrain.activeTerrain;
if (pTerrain == null)
{
Debug.Log("!!! pTerrain == null");
return;
}
TerrainData pTerrainData = pTerrain.terrainData;
if (pTerrainData == null)
{
Debug.Log("!!! pTerrainData == null");
return;
}
if (pTerrainData.treeInstances == null)
{
Debug.Log("!!! pTerrainData.treeInstances == null");
}
else
{
ArrayList pArrayList = new ArrayList();
pTerrainData.treeInstances = (TreeInstance[])pArrayList.ToArray(typeof(TreeInstance));
Debug.Log("+++ pTerrainData.treeInstances_TreeZero");
}
} //------------------------------------------------
//рождение деревьев
void _TreeCreate(int fIndex, Vector3 fPos, Color fCol, Color fColMap, float fScaleW, float fScaleH)
{
int pCPrototype = 0;
Terrain pTerrain = Terrain.activeTerrain;
if (pTerrain == null)
{
Debug.Log("!!! pTerrain == null");
return;
}
TerrainData pTerrainData = pTerrain.terrainData;
if (pTerrainData == null)
{
Debug.Log("!!! pTerrainData == null");
return;
}
TreePrototype[] pTreePrototype = pTerrainData.treePrototypes;
if (pTreePrototype == null)
{
Debug.Log("!!! pTreePrototype == null");
return;
}
pCPrototype = pTreePrototype.Length;
if (pCPrototype < 1)
{
Debug.Log("!!! pCPrototype < 1");
return;
}
int pIndex = fIndex;
if (pIndex < 0 || pIndex >= pCPrototype)
{
Debug.Log("!!! pIndex < 0 || pIndex >= pCPrototype");
return;
}
//
Vector3 pPosOb = fPos;
TreeInstance pTI = new TreeInstance();
pTI.position = pPosOb;
pTI.widthScale = fScaleW;
pTI.heightScale = fScaleH;
pTI.color = fCol;
pTI.lightmapColor = fColMap;
pTI.prototypeIndex = pIndex;
pTerrain.AddTreeInstance(pTI);
pTerrain.Flush();
if (pTerrainData.treeInstances == null)
{
Debug.Log("!!! pTerrainData.treeInstances == null");
}
else
{
int pCTI = pTerrainData.treeInstances.Length;
if (pCTI > 0)
{
TreeInstance pTrIn = pTerrainData.treeInstances[pCTI - 1];
Vector3 pPosTI = pTrIn.position;
Debug.Log("+++ pCTI=" + pCTI.ToString() + "/ fPos=" + fPos.ToString() + "/ pPosTI=" + pPosTI.ToString());
//
pTrIn.position = new Vector3(fPos.x, pPosTI.y, fPos.z);
}
else
{
Debug.Log("!!! pCTI_0");
}
}
Debug.Log("+++ pTerrain_AddTreeInstance_pIndex=" + pIndex.ToString());
} //------------------------------------------------
//получить номер слоя по имени
public static int F_Layer(string fs)
{
int pn = LayerMask.NameToLayer(fs);
return pn;
} //------------------------------------------------
//получить точку фокуса мыши
public static Vector3 F_PointFocusMouse(Ray fRay, float fRayLength, LayerMask fMask)
{
Vector3 pV = Vector3.zero;
Ray pRay = fRay;
RaycastHit pHit;
float pRayLength = fRayLength;
LayerMask pMask = fMask;
if (Physics.Raycast(pRay, out pHit, pRayLength, pMask.value))
{
pV = pHit.point;
}
return pV;
} //------------------------------------------------
} //------------------------------------------------
using System.Collections;
/// <summary>
/// деревья
/// </summary>
public class _Tree : MonoBehaviour
{
// Use this for initialization
void Start()
{
//очистка деревьев
_TreeZero();
//рождение деревьев
_TreeCreate(0, new Vector3(10, -1, 10), Color.white, Color.white, 1, 1);
//рождение деревьев
_TreeCreate(0, new Vector3(1000, 100, 1000), Color.white, Color.white, 1, 1);
} //------------------------------------------------
// Update is called once per frame
void Update()
{
bool pbClick = false;
if (Input.GetKey(KeyCode.LeftShift))
{
if (Input.GetMouseButtonUp(0))
{
pbClick = true;
}
}
//
if (pbClick)
{
LayerMask pMask = 0;
float pRayLength = 100;
Ray pRay = Camera.mainCamera.ScreenPointToRay(Input.mousePosition);
int pLayer = F_Layer("Default");
pMask |= 1 << pLayer;
Vector3 pPosP = F_PointFocusMouse(pRay, pRayLength, pMask);
Debug.Log("+++ pPosP=" + pPosP.ToString());
if (pPosP != Vector3.zero)
{
//рождение деревьев
_TreeCreate(0, pPosP, Color.white, Color.white, 1, 1);
}
}
} //------------------------------------------------
//------------------------------------------------
//очистка деревьев
void _TreeZero()
{
Terrain pTerrain = Terrain.activeTerrain;
if (pTerrain == null)
{
Debug.Log("!!! pTerrain == null");
return;
}
TerrainData pTerrainData = pTerrain.terrainData;
if (pTerrainData == null)
{
Debug.Log("!!! pTerrainData == null");
return;
}
if (pTerrainData.treeInstances == null)
{
Debug.Log("!!! pTerrainData.treeInstances == null");
}
else
{
ArrayList pArrayList = new ArrayList();
pTerrainData.treeInstances = (TreeInstance[])pArrayList.ToArray(typeof(TreeInstance));
Debug.Log("+++ pTerrainData.treeInstances_TreeZero");
}
} //------------------------------------------------
//рождение деревьев
void _TreeCreate(int fIndex, Vector3 fPos, Color fCol, Color fColMap, float fScaleW, float fScaleH)
{
int pCPrototype = 0;
Terrain pTerrain = Terrain.activeTerrain;
if (pTerrain == null)
{
Debug.Log("!!! pTerrain == null");
return;
}
TerrainData pTerrainData = pTerrain.terrainData;
if (pTerrainData == null)
{
Debug.Log("!!! pTerrainData == null");
return;
}
TreePrototype[] pTreePrototype = pTerrainData.treePrototypes;
if (pTreePrototype == null)
{
Debug.Log("!!! pTreePrototype == null");
return;
}
pCPrototype = pTreePrototype.Length;
if (pCPrototype < 1)
{
Debug.Log("!!! pCPrototype < 1");
return;
}
int pIndex = fIndex;
if (pIndex < 0 || pIndex >= pCPrototype)
{
Debug.Log("!!! pIndex < 0 || pIndex >= pCPrototype");
return;
}
//
Vector3 pPosOb = fPos;
TreeInstance pTI = new TreeInstance();
pTI.position = pPosOb;
pTI.widthScale = fScaleW;
pTI.heightScale = fScaleH;
pTI.color = fCol;
pTI.lightmapColor = fColMap;
pTI.prototypeIndex = pIndex;
pTerrain.AddTreeInstance(pTI);
pTerrain.Flush();
if (pTerrainData.treeInstances == null)
{
Debug.Log("!!! pTerrainData.treeInstances == null");
}
else
{
int pCTI = pTerrainData.treeInstances.Length;
if (pCTI > 0)
{
TreeInstance pTrIn = pTerrainData.treeInstances[pCTI - 1];
Vector3 pPosTI = pTrIn.position;
Debug.Log("+++ pCTI=" + pCTI.ToString() + "/ fPos=" + fPos.ToString() + "/ pPosTI=" + pPosTI.ToString());
//
pTrIn.position = new Vector3(fPos.x, pPosTI.y, fPos.z);
}
else
{
Debug.Log("!!! pCTI_0");
}
}
Debug.Log("+++ pTerrain_AddTreeInstance_pIndex=" + pIndex.ToString());
} //------------------------------------------------
//получить номер слоя по имени
public static int F_Layer(string fs)
{
int pn = LayerMask.NameToLayer(fs);
return pn;
} //------------------------------------------------
//получить точку фокуса мыши
public static Vector3 F_PointFocusMouse(Ray fRay, float fRayLength, LayerMask fMask)
{
Vector3 pV = Vector3.zero;
Ray pRay = fRay;
RaycastHit pHit;
float pRayLength = fRayLength;
LayerMask pMask = fMask;
if (Physics.Raycast(pRay, out pHit, pRayLength, pMask.value))
{
pV = pHit.point;
}
return pV;
} //------------------------------------------------
} //------------------------------------------------
все деревья создаются в одной позиции.
по TreeInstance.position = (1.0, 0.0, 1.0)
но по земле = (2000.0, 0.0, 2000.0)
что я делаю не правильно и как правильно создавать деревья?