转载请注明出处:http://www.cnblogs.com/shamoyuu/p/MouseAim.html

原理很简单,因为骨骼也是一个物体,也拥有transform那一套东西,所以可以简单地用LookAt来让某个骨骼望向目标点。

  1. using UnityEngine;
  2.  
  3. public class MouseAim : MonoBehaviour
  4. {
  5. // 要控制的骨骼
  6. public Transform spine;
  7.  
  8. // 要Lookat的那个点,把它设置为角色的子物体,然后z轴拉远一点
  9. public Transform point;
  10.  
  11. // 不断调试,获取具体旋转值,使角色正面朝向point
  12. public Vector3 spineAngle = new Vector3(139.48f, 88.85f, 11.3f);
  13.  
  14. // 调试用的小图片
  15. public Texture2D targetAim;
  16. // LookAt的点距离屏幕中心最大的距离,也就是限制了脖子转向的最大角度
  17. public float distance = ;
  18. // 鼠标指针所在的位置
  19. private Vector2 mousePoint;
  20. // 从哪个中心开始计算,我这里是用了屏幕中心
  21. private Vector2 center;
  22. // 图片展示的位置
  23. private Vector2 aimLoc;
  24.  
  25. void Start()
  26. {
  27. // 获取中心点位置
  28. center = new Vector2(Screen.width / 2f, Screen.height / 2f);
  29. }
  30.  
  31. void LateUpdate()
  32. {
  33. UpdatePosition();
  34. }
  35.  
  36. private void UpdatePosition()
  37. {
  38. // 获取鼠标位置
  39. mousePoint = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
  40.  
  41. // 临时变量,如果没有超出distance距离,就用鼠标位置,
  42. // 否则用center到鼠标位置的单位向量×distance,再加上center坐标,就可以得到从center到鼠标位置被绳子拴住的一个点
  43. // (可以理解为center为圆心,distance为半径,计算这个点在圆里的坐标)
  44. // 数学不好还真不好理解- -!!!
  45. Vector2 temp = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
  46. if (Vector2.Distance(mousePoint, center) > distance)
  47. {
  48. temp = (mousePoint - center).normalized * distance + center;
  49. }
  50. aimLoc = Camera.main.WorldToViewportPoint(Camera.main.ScreenToWorldPoint(new Vector3(temp.x, temp.y, Camera.main.farClipPlane)));
  51.  
  52. if (point != null)
  53. {
  54. Vector3 pointPosition = point.localPosition;
  55. // 此处数值可能要稍作修改,主要取决于aimLoc在x和y的最大值和最小值,还有point的y轴(1.2f)
  56. pointPosition.x = (aimLoc.x - 0.5f) / 0.24f;
  57. pointPosition.y = (aimLoc.y - 0.5f) / 0.31f / 1.5f + 1.2f;
  58. point.localPosition = pointPosition;
  59. spine.LookAt(point, Vector3.up);
  60. spine.Rotate(spineAngle);
  61. }
  62. }
  63.  
  64. // 在屏幕上绘制那个点,方便调试
  65. void OnGUI()
  66. {
  67. GUI.DrawTexture(new Rect(aimLoc.x * Screen.width - , Screen.height - (aimLoc.y * Screen.height) - , , ), targetAim, ScaleMode.StretchToFill, true, 10.0f);
  68. }
  69. }

↑↑↑代码就是这么简单↑↑↑

可以看到我们的角色在边跑边攻击的时候,头部还一直望向目标

效果很不错,当然也不是只能用来控制头部,如果是腰部的骨骼的话,就可以做第一人称射击游戏那种转向瞄准了

补图

此图中的2个小圆球,就是point,一个是头部的,一个是右手臂的

【Unity3D】Unity3D 让角色的头部望向鼠标的更多相关文章

  1. [Unity3D]Unity3D游戏开发之角色控制漫谈

    各位朋友,大家好.我是秦元培,欢迎大家关注我的博客,我的博客地址blog.csdn.net/qinyuanpei.今天呢,我们来说说Unity3D中的角色控制,这篇文章并非关注于Unity3D中的某项 ...

  2. [Unity3D]Unity3D圣骑士模仿游戏开发传仙灵达到当局岛

    大家好,我是秦培.欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 在前面的文章中.我们分别实现了一个自己定义的角色控制器<[Unity3D]Unity3D游戏开 ...

  3. [Unity3D]Unity3D持久性数据的游戏开发PlayerPrefs采用

    大家好,我是秦培,欢迎关注我的博客,我的博客地址">blog.csdn.net/qinyuanpei. 博主今天研究了在Unity3D中的数据持久化问题.数据持久化在不论什么一个开发领 ...

  4. [Unity3D]Unity3D游戏开发之飞机大战项目解说

    大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比較综合的 ...

  5. 【Unity3D】3D角色换装++ Advance

    http://www.cnblogs.com/dosomething/archive/2012/12/15/2818897.html 本文在之前的文章Unity3D角色换装的原理 基础上做一个补充 给 ...

  6. 【Unity3d】3d角色换装实现原理及步骤

    http://www.cnblogs.com/dosomething/archive/2012/04/15/2450526.html 1.角色模型制作 unity3d支持Skin动画  但是不支持Ph ...

  7. unity3d 摄像机跟随角色时被物体遮挡解决方案

    参考文章:http://www.xuanyusong.com/archives/1991 在看此文章时请先看上面的参考文章 看完以上文章后,你也许会想人家都已经给出所有代码了,你还写个毛啊 别急,现在 ...

  8. unity3d NGUI制作角色展示框

    最近在搞赛车漂移,所以一直没有更新博客 现在已经实现圈数检测.复位点检测.反向检测等功能 本来准备写成三篇文章的,太忙了,等过段时间不忙了在写吧 今天有朋友问我3D角色怎么给他固定在一个框里面 这个功 ...

  9. unity3d自己写角色移动脚本

    废话没有,直接上代码: using UnityEngine; using System.Collections; public class SuperWalk : MonoBehaviour { pu ...

随机推荐

  1. JavaScript函数调用模式

    1.方法调用模式: var myObj = { value : 0; increment:function(inc){ this.value += typeof inc === 'number' ? ...

  2. c# 简单实现 插件模型 反射方式

    利用反射方式实现插件模型,wpf控件作为插件,然后用另外的窗体加载. 首先定义插件接口: public interface IUserControlLevel1 { string PluginName ...

  3. iOS-获取通讯录联系人信息

    头文件 #import <AddressBook/AddressBook.h> #import <AddressBookUI/AddressBookUI.h> 授权 关于通讯录 ...

  4. web.xml 文件中一般包括 servlet, spring, filter, listenr的配置的加载顺序

    首先可以肯定 加载顺序与他们在web.xml 文件中的先后顺序无关. web.xml 中 listener 和 serverlet 的加载顺序为 先 listener 后serverlet最终得出结果 ...

  5. Objective-C Runtime 文档翻译

    前言   Objective-C语言尽可能多的将许多决定从编译连接推迟到运行时.无论何时,它都尽可能的动态处理事件.这就意味着OC语言不仅仅需要编译器,还需要一个运行时系统来执行编译完成的代码.对于O ...

  6. 从UUID想到的

    1.UUID的定义 通用唯一标识符(UUID)被设计成一个在时间和空间上都独一无二的数字,常被用作唯一性标识. UUID是一个由5位十六进制数的字符串表示的128比特数字,其格式为 aaaaaaaa- ...

  7. 一个巨low的“2048”

    代码就是这样,做的不是4*4而是一个2*2 #include<stdio.h>#include<stdlib.h>#include<time.h>int main( ...

  8. Netty学习笔记(二)

    只是代码,建议配合http://ifeve.com/netty5-user-guide/此网站观看 package com.demo.netty; import org.junit.Before;im ...

  9. ionic2+Angular 使用HttpInterceptorService拦截器 统一处理数据请求

    sstep1:新建http-Interceptor.ts文件 import { Injectable } from '@angular/core'; import { HttpInterceptorS ...

  10. testng 异常 截图

    testNG里有一个异常监听类,失败时会执行类里的相关方法 DriverBase 截图类 TestngListenerScreen 异常监听类 Test1 测试类1.DriverBase类 packa ...