我正在创建一款2D平台游戏,我希望能够在游戏(游戏模式)中使用光标(就像油漆一样)绘制可以作为可行走地形的线条。我对编码和我使用的c#都很陌生,我真的很难想象这是如何实现的,更不用说如果可能的话?如果你们能给我一些建议,也许能帮我把它推向正确的方向,我会很感激的。谢谢!
编辑:所以我现在得到了一些代码让我能够在播放模式中绘图。现在的问题是我如何实现一种类型的碰撞器?也许每个点可以代表一个小正方形什么的?我该怎么做呢?这里有一些代码。谢谢。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class DrawLine : MonoBehaviour
{
private LineRenderer line;
private bool isMousePressed;
private List<Vector3> pointsList;
private Vector3 mousePos;
// Structure for line points
struct myLine
{
public Vector3 StartPoint;
public Vector3 EndPoint;
};
// -----------------------------------
void Awake()
{
// Create line renderer component and set its property
line = gameObject.AddComponent<LineRenderer>();
line.material = new Material(Shader.Find("Particles/Additive"));
line.SetVertexCount(0);
line.SetWidth(0.1f,0.1f);
line.SetColors(Color.green, Color.green);
line.useWorldSpace = true;
isMousePressed = false;
pointsList = new List<Vector3>();
}
// -----------------------------------
void Update ()
{
// If mouse button down, remove old line and set its color to green
if(Input.GetMouseButtonDown(0))
{
isMousePressed = true;
line.SetVertexCount(0);
pointsList.RemoveRange(0,pointsList.Count);
line.SetColors(Color.green, Color.green);
}
else if(Input.GetMouseButtonUp(0))
{
isMousePressed = false;
}
// Drawing line when mouse is moving(presses)
if(isMousePressed)
{
mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
mousePos.z=0;
if (!pointsList.Contains (mousePos))
{
pointsList.Add (mousePos);
line.SetVertexCount (pointsList.Count);
line.SetPosition (pointsList.Count - 1, (Vector3)pointsList [pointsList.Count - 1]);
}
}
}
}
关于手段和工具:
Input.mousePosition
输入。GetKey,输入。GetKeyDown,输入。GetKeyUp
线条渲染器手册
行渲染脚本API
关于总体思路:
您的脚本可能使用Input。GetKey触发特性功能(例如键盘键)。
功能激活后,脚本等待通过Input点击鼠标按钮。GetKeyUp事件发生时,它必须使用Input.mousePosition捕获当前鼠标位置。
只需要两个点来构建线段,所以当脚本检测到第二个点的输入时,它可能会创建代表一块可行走地形的游戏对象。
在视觉上,这样的对象可以用行渲染器表示。为了实现与其他游戏对象(如玩家角色)的交互,通常只需使用collider组件来增强对象(假设使用BoxCollider)。关于如何添加对撞机:
GameObject CreateLineCollider(Vector3 point1, Vector3 point2, float width)
{
GameObject obj = new GameObject("LineCollider");
obj.transform.position = (point1+point2)/2;
obj.transform.right = (point2-point1).normalized;
BoxCollider boxCollider = obj.AddComponent<BoxCollider>();
boxCollider.size = new Vector3( (point2-point1).magnitude, width, width );
return obj;
}
你可以用线渲染器给物体添加碰撞器,但你仍然必须正确地定位它。
代码中的集成示例:
void Update ()
{
...
// Drawing line when mouse is moving(presses)
if(isMousePressed)
{
mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
mousePos.z=0;
if (!pointsList.Contains (mousePos))
{
pointsList.Add (mousePos);
line.SetVertexCount (pointsList.Count);
line.SetPosition (pointsList.Count - 1, (Vector3)pointsList [pointsList.Count - 1]);
const float ColliderWidth = 0.1f;
Vector3 point1 = pointsList[pointsList.Count - 2];
Vector3 point2 = pointsList[pointsList.Count - 1];
GameObject obj = new GameObject("SubCollider");
obj.transform.position = (point1+point2)/2;
obj.transform.right = (point2-point1).normalized;
BoxCollider boxCollider = obj.AddComponent<BoxCollider>();
boxCollider.size = new Vector3( (point2-point1).magnitude, ColliderWidth , ColliderWidth );
obj.transform.parent = this.transform;
}
}
}