我如何创造一个游戏内系统,让我可以用光标绘制线条,充当可行走的地形

本文关键字:光标 绘制 创造 何创造 一个 系统 游戏 我可以 | 更新日期: 2023-09-27 18:17:22

我正在创建一款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;
    }
  }
}