Unity3D写C#脚本,用鼠标左键按下选中模型时,控制一个模型按照模型的X轴向移动,Y轴向移动,Z轴向移动。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D写C#脚本,用鼠标左键按下选中模型时,控制一个模型按照模型的X轴向移动,Y轴向移动,Z轴向移动。相关的知识,希望对你有一定的参考价值。

Unity3D写C#脚本,用鼠标左键按下选中模型时,控制一个模型按照模型的X轴向移动,Y轴向移动,Z轴向移动。

参考技术A C语言是很多语言的前身,是很厉害的语言,而且效率很高。如果水平很好的话,我觉得用C语言写游戏是完全可行的,而且游戏可能还会更有效率一些,实时性更好一些,但是很多东西都必须自己实现,这一点很考验水平。
Unity3D是一个游戏引擎,里面封装了很多直接就可以使用的效果,而且设计得比较方便使用,提供的API也很多们很好用,使用难度比起前一种要减少很多很多,但是效率可能不会有完全自己实现高,优化问题可能更重要一些。
Unity3D用C#和javascript比较多,至少C#的前身是C,并且C#的效率比起C低一些。

本人自己初学,只是说一下自己的观点,如果不正确,希望指正,多谢了。
参考技术B 表砸esc鼠标左键空格

鼠标左键按下时如何更改鼠标光标?

【中文标题】鼠标左键按下时如何更改鼠标光标?【英文标题】:How do I change the mouse cursor when the left mouse button is down? 【发布时间】:2010-09-27 11:40:43 【问题描述】:

在 Delphi 2007 中,在鼠标移动事件中,我尝试使用以下命令更改鼠标光标:

procedure TFr_Board_Display.PaintBox_Proxy_BoardMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin

  if left_mouse_button_down then begin  
    if some_condition then begin
      Cursor := crDrag;
    end
    else begin
      Cursor := crNoDrop;
    end;
  end
  else begin
    if some_other_condition then begin
      Cursor := crHandPoint;
    end
    else begin
      Cursor := crDefault;
    end;
  end;
end;

例如。但是,当按下鼠标左键并移动鼠标时,光标不会变为 crDrag 或 crNoDrop。代码被执行(例如 Cursor := crDrag;)但光标没有改变。当鼠标左键向上时,我移动鼠标,光标改变没有问题。

(我最初尝试使用一些拖放事件和属性,但无法让一切按我想要的方式工作。)

编辑:阐明所需行为和格式化代码。

编辑:谢谢你,Gamecat,但我希望鼠标左键按下时光标会改变,而鼠标移动时光标应该在 crDrag 和 crNoDrop 之间来回改变。

【问题讨论】:

添加了更多信息,因此可以在鼠标移动时使用。 【参考方案1】:

如果您在 OnMouseDown 中设置鼠标光标并在 OnMouseUp 中重置它,一切正常:

procedure TForm4.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Cursor := crCross;
end;

procedure TForm4.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Cursor := crDefault; // Or you can restore a saved cursor.
end;

如果您希望鼠标光标在鼠标移动时做出反应,请使用以下命令:

procedure TForm4.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ssLeft in Shift then begin
    if X<100 then
      Screen.Cursor := crCross
    else
      Screen.Cursor := crHourGlass;
  end else
    Screen.Cursor := crDefault;  // Or you can restore a saved cursor.
end;

procedure TForm4.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Screen.Cursor := crDefault; // Or you can restore a saved cursor.
end;

MouseUp 是必需的,否则光标悬停在控件上方时不会变回。

确保在任何地方都使用 Screen.Cursor。

【讨论】:

【参考方案2】:

有点离题,但可能对你有用。

我创建了一个全局堆栈以允许嵌套游标更改。它允许任何一段代码将鼠标光标设置为他们想要的,而不用担心他们的调用者或被调用者的设置。

例如:

procedure AskUserWhatToDo;
begin
  PushMouseCursor(crArrow);
  try
     if MessageDlg('Abort?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
        SysUtils.Abort;
  finally
     PopMouseCursor;
  end;
end;

procedure LongProcess;
begin
  PushMouseCursor(crHourglass);
  try
     //  do something
     if QuestionableState then
       AskUserWhatToDo;
     //  do something
  finally
    PopMouseCursor;
  end;
end;

两个程序都不必担心其他程序需要什么状态或离开鼠标光标。

//===============================================================
//   in a universal utility module (mine is called CraftWindows.pas)

function SetMouseCursor(ACursor : TCursor) : TCursor;
begin
   Result := Screen.Cursor;
   Screen.Cursor := ACursor;
end;

var
   GlobalMouseCursorStack : TList = nil;

procedure PushMouseCursor(ACursor : TCursor);
begin
   if GlobalMouseCursorStack = nil then
       GlobalMouseCursorStack := TList.Create;

   GlobalMouseCursorStack.Add(Pointer(SetMouseCursor(ACursor)));
end;

procedure PopMouseCursor;
begin
   if (GlobalMouseCursorStack <> nil) and (GlobalMouseCursorStack.Count > 0) then
   begin
       SetMouseCursor(TCursor(GlobalMouseCursorStack.Last));
       GlobalMouseCursorStack.Delete(GlobalMouseCursorStack.Count - 1);
   end;
end;

...

finalization
  GlobalMouseCursorStack.Free;

【讨论】:

以上是关于Unity3D写C#脚本,用鼠标左键按下选中模型时,控制一个模型按照模型的X轴向移动,Y轴向移动,Z轴向移动。的主要内容,如果未能解决你的问题,请参考以下文章

鼠标左键按下时如何更改鼠标光标?

Chrome浏览器下JQuery实现鼠标左键按下移动,鼠标左键抬起停止移动功能的问题

如何在鼠标左键按下时触发循环 autoclicker c++

你好,请问在UNITY3D中如何实现用鼠标左键拖拽控制一个组合物体的旋转啊?

鼠标右键按下和放开的键代码是多少

Cesium — Entity 拖拽、属性修改