【Unity3D】Unity3D 让角色的头部望向鼠标
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/MouseAim.html
原理很简单,因为骨骼也是一个物体,也拥有transform那一套东西,所以可以简单地用LookAt来让某个骨骼望向目标点。
- using UnityEngine;
- public class MouseAim : MonoBehaviour
- {
- // 要控制的骨骼
- public Transform spine;
- // 要Lookat的那个点,把它设置为角色的子物体,然后z轴拉远一点
- public Transform point;
- // 不断调试,获取具体旋转值,使角色正面朝向point
- public Vector3 spineAngle = new Vector3(139.48f, 88.85f, 11.3f);
- // 调试用的小图片
- public Texture2D targetAim;
- // LookAt的点距离屏幕中心最大的距离,也就是限制了脖子转向的最大角度
- public float distance = ;
- // 鼠标指针所在的位置
- private Vector2 mousePoint;
- // 从哪个中心开始计算,我这里是用了屏幕中心
- private Vector2 center;
- // 图片展示的位置
- private Vector2 aimLoc;
- void Start()
- {
- // 获取中心点位置
- center = new Vector2(Screen.width / 2f, Screen.height / 2f);
- }
- void LateUpdate()
- {
- UpdatePosition();
- }
- private void UpdatePosition()
- {
- // 获取鼠标位置
- mousePoint = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
- // 临时变量,如果没有超出distance距离,就用鼠标位置,
- // 否则用center到鼠标位置的单位向量×distance,再加上center坐标,就可以得到从center到鼠标位置被绳子拴住的一个点
- // (可以理解为center为圆心,distance为半径,计算这个点在圆里的坐标)
- // 数学不好还真不好理解- -!!!
- Vector2 temp = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
- if (Vector2.Distance(mousePoint, center) > distance)
- {
- temp = (mousePoint - center).normalized * distance + center;
- }
- aimLoc = Camera.main.WorldToViewportPoint(Camera.main.ScreenToWorldPoint(new Vector3(temp.x, temp.y, Camera.main.farClipPlane)));
- if (point != null)
- {
- Vector3 pointPosition = point.localPosition;
- // 此处数值可能要稍作修改,主要取决于aimLoc在x和y的最大值和最小值,还有point的y轴(1.2f)
- pointPosition.x = (aimLoc.x - 0.5f) / 0.24f;
- pointPosition.y = (aimLoc.y - 0.5f) / 0.31f / 1.5f + 1.2f;
- point.localPosition = pointPosition;
- spine.LookAt(point, Vector3.up);
- spine.Rotate(spineAngle);
- }
- }
- // 在屏幕上绘制那个点,方便调试
- void OnGUI()
- {
- GUI.DrawTexture(new Rect(aimLoc.x * Screen.width - , Screen.height - (aimLoc.y * Screen.height) - , , ), targetAim, ScaleMode.StretchToFill, true, 10.0f);
- }
- }
↑↑↑代码就是这么简单↑↑↑
可以看到我们的角色在边跑边攻击的时候,头部还一直望向目标
效果很不错,当然也不是只能用来控制头部,如果是腰部的骨骼的话,就可以做第一人称射击游戏那种转向瞄准了
补图
此图中的2个小圆球,就是point,一个是头部的,一个是右手臂的
【Unity3D】Unity3D 让角色的头部望向鼠标的更多相关文章
- [Unity3D]Unity3D游戏开发之角色控制漫谈
各位朋友,大家好.我是秦元培,欢迎大家关注我的博客,我的博客地址blog.csdn.net/qinyuanpei.今天呢,我们来说说Unity3D中的角色控制,这篇文章并非关注于Unity3D中的某项 ...
- [Unity3D]Unity3D圣骑士模仿游戏开发传仙灵达到当局岛
大家好,我是秦培.欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 在前面的文章中.我们分别实现了一个自己定义的角色控制器<[Unity3D]Unity3D游戏开 ...
- [Unity3D]Unity3D持久性数据的游戏开发PlayerPrefs采用
大家好,我是秦培,欢迎关注我的博客,我的博客地址">blog.csdn.net/qinyuanpei. 博主今天研究了在Unity3D中的数据持久化问题.数据持久化在不论什么一个开发领 ...
- [Unity3D]Unity3D游戏开发之飞机大战项目解说
大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比較综合的 ...
- 【Unity3D】3D角色换装++ Advance
http://www.cnblogs.com/dosomething/archive/2012/12/15/2818897.html 本文在之前的文章Unity3D角色换装的原理 基础上做一个补充 给 ...
- 【Unity3d】3d角色换装实现原理及步骤
http://www.cnblogs.com/dosomething/archive/2012/04/15/2450526.html 1.角色模型制作 unity3d支持Skin动画 但是不支持Ph ...
- unity3d 摄像机跟随角色时被物体遮挡解决方案
参考文章:http://www.xuanyusong.com/archives/1991 在看此文章时请先看上面的参考文章 看完以上文章后,你也许会想人家都已经给出所有代码了,你还写个毛啊 别急,现在 ...
- unity3d NGUI制作角色展示框
最近在搞赛车漂移,所以一直没有更新博客 现在已经实现圈数检测.复位点检测.反向检测等功能 本来准备写成三篇文章的,太忙了,等过段时间不忙了在写吧 今天有朋友问我3D角色怎么给他固定在一个框里面 这个功 ...
- unity3d自己写角色移动脚本
废话没有,直接上代码: using UnityEngine; using System.Collections; public class SuperWalk : MonoBehaviour { pu ...
随机推荐
- JavaScript函数调用模式
1.方法调用模式: var myObj = { value : 0; increment:function(inc){ this.value += typeof inc === 'number' ? ...
- c# 简单实现 插件模型 反射方式
利用反射方式实现插件模型,wpf控件作为插件,然后用另外的窗体加载. 首先定义插件接口: public interface IUserControlLevel1 { string PluginName ...
- iOS-获取通讯录联系人信息
头文件 #import <AddressBook/AddressBook.h> #import <AddressBookUI/AddressBookUI.h> 授权 关于通讯录 ...
- web.xml 文件中一般包括 servlet, spring, filter, listenr的配置的加载顺序
首先可以肯定 加载顺序与他们在web.xml 文件中的先后顺序无关. web.xml 中 listener 和 serverlet 的加载顺序为 先 listener 后serverlet最终得出结果 ...
- Objective-C Runtime 文档翻译
前言 Objective-C语言尽可能多的将许多决定从编译连接推迟到运行时.无论何时,它都尽可能的动态处理事件.这就意味着OC语言不仅仅需要编译器,还需要一个运行时系统来执行编译完成的代码.对于O ...
- 从UUID想到的
1.UUID的定义 通用唯一标识符(UUID)被设计成一个在时间和空间上都独一无二的数字,常被用作唯一性标识. UUID是一个由5位十六进制数的字符串表示的128比特数字,其格式为 aaaaaaaa- ...
- 一个巨low的“2048”
代码就是这样,做的不是4*4而是一个2*2 #include<stdio.h>#include<stdlib.h>#include<time.h>int main( ...
- Netty学习笔记(二)
只是代码,建议配合http://ifeve.com/netty5-user-guide/此网站观看 package com.demo.netty; import org.junit.Before;im ...
- ionic2+Angular 使用HttpInterceptorService拦截器 统一处理数据请求
sstep1:新建http-Interceptor.ts文件 import { Injectable } from '@angular/core'; import { HttpInterceptorS ...
- testng 异常 截图
testNG里有一个异常监听类,失败时会执行类里的相关方法 DriverBase 截图类 TestngListenerScreen 异常监听类 Test1 测试类1.DriverBase类 packa ...