2018-01-17 19:54:30 weixin_40924754 阅读数 9501
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

  第一次写博客,有什么不足之处请多多原谅,本章的主要讲的是fps的第一人称视角,我们要知道,第一人称视角在unity3d里怎么实现,主要有两个,一个是主角和另一个是摄像机

(如果你们认真看完这个教程fps第一人称视角是完全可以学会的。不要跳行看,看完这个教程一个小时都不到。我相信有人连这个都没看直接看下面)吐舌头

首先上图:

Ethan这个主角是unity自带的模型,Main Camera是一个摄像机。(图片我没处理(你以为我不想啊博客没有截屏我有ps但是我已经懒得处理了)自已放大看)

第一步:将摄像机移到主角身上作为一个子级物体(然后在Scene面板,将移动摄像机到主角面前如我上面那图)。如我上图那样子。(这时候陈独秀同学会问:上面图那么大你要我怎么找啊)陈独秀你给我过来我一巴掌你,你不会看Create面板吗?就是那个黑色箭头那个面板。对你没看错。就是黑色箭头那里。(虽然画的丑了点,但是你们看明白就行了)

第二步:在主角身上添加一个Character Controller组件。(陈独秀:这什么鬼组件,在哪里啊),呵呵,Character Controller这个组件是角色控制器的意思。位置:在我上面图片右下角那里有一个Add Component在physics里面。

然后可以写(复制)代码了是不是很开心。(开心个鬼看到代码就直接复制粘贴你们nb,不修改,你们复制下面的代码能运行我拜你为师)(照着下面照片的代码抄的同学注意了最后面一行还有一个})


对没错就是上面那个那些代码。就50行不到就ok了,完成第一人称视角。(陈独秀:解析呢。都没有解析学个毛啊)

唉陈独秀同学就是这么心急。我一行一行给你们解析清楚ok(说是这么说反正你们又不顺着网线来打我);

ps: 别复制下面代码。

CharacterController playerController;  //这行代码是声明一个CharacterController类;


    Vector3 direction; //声明3维向量;

    public float speed = 1;   //主角的移动速度
    public float jumpPower = 5; //主角跳的高度
    public float gravity = 7f; //重力

    public float mousespeed = 5f; //鼠标快慢

    public float minmouseY = -45f; //限制鼠标y轴(你们想一想眼睛能看到后面的吗?可以的话你nb)
    public float maxmouseY = 45f;

    float RotationY = 0f;
    float RotationX = 0f;这两个存放的是鼠标输入

    public Transform agretctCamera;  //这个必须在Create面板拖放Main Camera(也就是摄像机)这个位置里否则没有效果,这个类是存放的是摄像机位置;

// Use this for initialization
void Start () {

//这个函数就不说明了,看到这里的都是基础过关了吧?
        playerController = this.GetComponent<CharacterController>(); //获取依附在这个物体上的CharacterController组件

        Screen.lockCursor = true;//鼠标隐藏(新的unity5.0版本以上好像用这个会警告,我就不用新的了反正旧的能用我去研究新的用法干嘛,我有病啊,(你以为我会告诉你我他喵的根本看不懂官方怎么解析的么呵呵))

    }

// Update is called once per frame
void Update () {//这个方法都要我解析,陈独秀你过来,(蠢蠢欲动的陈独秀:我什么都没说好吗,关我什么事)
        float _horizontal = Input.GetAxis("Horizontal");//将水平轴的给_horizontal
        float _vertical = Input.GetAxis("Vertical");//同上(呵呵我会告诉你我懒得打)


        if (playerController.isGrounded)

//(陈独秀:这个playerController是什么鬼啊)呵呵陈独秀同学坐下,我先给你一巴掌先前面不是声明了playerController获取CharacterController组件吗?这么快就忘了 你很棒棒噢。CharacterController组件中有一个检测是否到地面的方法就是.isGrounded。这个在CharacterController才有的,记住了陈独秀同学。playerController.isGrounded也就是说主角在地面上。
        {
            direction = new Vector3(_horizontal,0,_vertical);//在地面上才能移动,这个是移动向量


            if (Input.GetKeyDown(KeyCode.Space))     //检测你是否按下了空格键     
                direction.y = jumpPower;      //如果按下了空格键就三维向量中的y轴等于jumpPower(呵呵,陈独秀同学是不是又忘了jumpPower是什么了,回头看看都声明了什么)     
        }
        direction.y -= gravity * Time.deltaTime;//这个在if语句外也就是说主角的向下的重力


        playerController.Move(playerController.transform.TransformDirection(direction*Time.deltaTime*speed));
//这句就有点难理解了,我都不知道怎么解析, playerController.Move()这个是移动方法,playerController.transform.TransformDirection()这个是跟随世界坐标的意思,如果没有这个主角身体转向的时候它就是一个方向,按w的时候永远只朝着一个方向移动。唉解析什么的最烦了自已百度。


       RotationX += agretctCamera.transform.localEulerAngles.y + Input.GetAxis("Mouse X") * mousespeed;

//存放摄像机(也就是鼠标)x轴
        RotationY -= Input.GetAxis("Mouse Y") * mousespeed;//存放摄像机(也就是鼠标)y轴


        RotationY = Mathf.Clamp(RotationY,minmouseY,maxmouseY);//限制鼠标上下,Mathf这个是数学函数的意思,

Math不是数学吗?f不就是初中,高中的时候  你们最讨厌的函数么,像 f=xxx+xx+x那种;


        this.transform.eulerAngles = new Vector3(0,RotationX,0);//主角的y轴旋转(为什么有两个0,你想想主角围着x轴旋转会怎样)


        agretctCamera.transform.eulerAngles = new Vector3(RotationY, RotationX, 0);//这个是摄像机上下左右。

好了就到这了,有些自已百度吧,比如eulerAngles这个是什么意思(难道还要我解析给你们看,我又不是百科全书,想学的人我不说也会,不想学的他早就xx掉我这条博客了,反之他又看不到,)重要的是自已理解。不是复制代码,没有用的。最后保存上面代码图片自已手动打一遍吧。不会在下面留评论,别乱喷人啊,我幼小的心灵很脆弱的,最后给上源码一份。



这个代码可以复制哦:(照着上面图片抄的同学后悔了没)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class fps1 : MonoBehaviour {
    CharacterController playerController;


    Vector3 direction;


    public float speed = 1;
    public float jumpPower = 5;
    public float gravity = 7f;


    public float mousespeed = 5f;


    public float minmouseY = -45f;
    public float maxmouseY = 45f;


    float RotationY = 0f;
    float RotationX = 0f;


    public Transform agretctCamera;


// Use this for initialization
void Start () {
        playerController = this.GetComponent<CharacterController>();
        Screen.lockCursor = true;
    }

// Update is called once per frame
void Update () {
        float _horizontal = Input.GetAxis("Horizontal");
        float _vertical = Input.GetAxis("Vertical");

        if (playerController.isGrounded)
        {
            direction = new Vector3(_horizontal,0,_vertical);
            if (Input.GetKeyDown(KeyCode.Space))           
                direction.y = jumpPower;           
        }
        direction.y -= gravity * Time.deltaTime;
        playerController.Move(playerController.transform.TransformDirection(direction*Time.deltaTime*speed));

       RotationX += agretctCamera.transform.localEulerAngles.y + Input.GetAxis("Mouse X") * mousespeed;
        RotationY -= Input.GetAxis("Mouse Y") * mousespeed;
        RotationY = Mathf.Clamp(RotationY,minmouseY,maxmouseY);
        this.transform.eulerAngles = new Vector3(0,RotationX,0);
        agretctCamera.transform.eulerAngles = new Vector3(RotationY, RotationX, 0);
}
   
}


2013-11-20 20:12:45 huangfe1 阅读数 1059
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。



那抱歉,上次那个Unity+kinect还没有更新,最近在深一步研究,不久将更新(绝对不负众望)!现在进入正题,十分钟带你打造unity3D第一人称射击游戏!

看完本篇博客,你将学会第一人称控制,粒子的添加,碰撞的检测,鼠标的监听,画2d图像,预制物体克隆,添加力,添加声音等等!(本篇博客假设你已经对unity稍微有点了解)

一,打开unity,创建一个场景,添加一个plane,(gameobject->createother->plane)。

二,添加虚拟第一人称任务(现在没搞模型,模型后面可以自己添加);Assert->importpackages->Charactercontroll,之后你将Project面板里面看到这个资源包,打开里面的charactercontroll文件,将里面的first Person controll拖动到合适的位置。

三,然后我们将添加一个虚拟的枪口,作为子弹的发生点!这个你可以创建一个椭圆,放在摄像机的最中间


 然后要将椭圆设置为摄像机的子物体,这样他将随着摄像机运动(不能设置为任务模型的子物体,因为任务模型的不能上下移动,也就不是这样后不能上下射击)。也就是在hierahcry面板中点击你创建椭圆,拖到摄像机上,这样他就成了摄像机的子物体。可以点击运行测试下,你会发现这东西只是虚拟枪口,所以我们设置它看不见,点击椭圆,在修改面板上,有个MeshRender,你单击下,椭圆就看不见了,但是它存在,然后再点击CapsuleColisder,取消他的碰撞(以免影响子弹的射击);
三,子弹的射击

我们首先创建一个圆,(用这个圆来模拟子弹,如果你自己有子弹模型,就用子弹模型),然后在project中创建一个prefab,用于之后的克隆子弹,现在我们来子弹一点火焰效果,Assert->importpackage->particles导入粒子,点击里面的fire,将里面的Flame拖到游戏中,位置和你创建的球(子弹)一样,然后将你设置的,然后同样的方法,将火焰设置为,子弹的子物体,这样,火焰将和子弹一起运动,自己在属性面板里 修改火焰的大小,然后将子弹拖到你创建的prefab中,修改prefab的名字为balls!添加一个刚体属性,Rigidbody(Addcomment->ragidbody)然后删除游戏中的子弹(嗯,删除)!现在子弹的预制物体已经创建好了,现在我们来射击!

四 ,点击鼠标,发生子弹

现在 就是敲代码码的时候了

var aim:Transform;
//克隆子弹
private var ball:Transform;
//绘制准星的材质
var material:Material;
function Start () {

}

function Update () {
//将鼠标的图标隐藏
Screen.showCursor=false;
//var zj=Vector3(Screen.width/2,Screen.height/2,0);
//var ray:Ray=Camera.main.ScreenPointToRay(Input.mousePosition);
//定义一个方向,为发射点y轴方向
var dir=aim.transform.TransformDirection(Vector3.up);
//var dir=ray.direction;
//按下鼠标左键
if(Input.GetMouseButtonDown(0)){
//实列化一个球,发射点的位置,
ball=Instantiate(balls,aim.position,Quaternion.identity);
//在某一个方向加一个力
ball.rigidbody.AddForce(dir.normalized*1000);
print("----------->>>");
//三秒后删除小球
Destroy(ball.gameObject,3);
}
}

 这里用到了,Screen.showCursor=false;将鼠标隐藏,要将他放在updatae中,放在start中不行var dir=aim.transform.TransformDirection(Vector3.up);这是定义一个方向,子弹将以这个方向射击

其他的没什么解释的了,注释很详细了,方法里面传入的参数,查一下API文档就行

五 ,现在们开始绘制准星

 

//绘制准星的材质

var material:Material;

先定义 一个材质,用来绘制图像

 

//绘制准星
function OnPostRender(){
DrawRecent(Screen.width/2,Screen.height/2,10,10);
}
//绘制四边形的方法
function DrawRecent(x:float,y:float,width:float,height:float){
//材质通道设置为默认的0
 material.SetPass(0);
 //绘制2D图形
  GL.LoadOrtho();
 //绘制长方体
 GL.Begin(GL.QUADS);
 //传入四个点的相对屏幕的坐标,先后分别是左上角,左下角,右下角,右上角
  GL.Vertex(new Vector3(x/Screen.width,y/Screen.height,0));
  GL.Vertex(new Vector3(x/Screen.width,(y+height)/Screen.height,0));
  GL.Vertex(new Vector3((x+width)/Screen.width,(y+height)/Screen.height,0));
  GL.Vertex(new Vector3((x+width)/Screen.width,y/Screen.height,0));
  //结束绘画
  GL.End();
}

 这个没什么好解释的,注释有,按照各个规则就是

 

然后就是,如果你射击到了敌人,敌人就着火

四,射击敌人

首先我们,创建几个cube,这个用来模拟敌人,如果你有好的模型,就用模型。给cube创建ridibody

然后给它一个标签,在属性面板上面有个Tag,点击,选择player,给个player标签,你也可以点击addTag自己添加一个Tag,现在我们创建一个prefab预制火火焰,创建一个空物体,将先前导入的fires拖到空物体中

将空物体放入prefab中,改名为fires

现在 我们添加碰撞事件

新建一个脚本,

 

#pragma strict
//预制火焰
var fires:Transform;
//克隆火焰
private var fire:Transform;
function Start () {

}

function Update () {

}//碰撞监听
function OnCollisionEnter(other:Collision){
//如果碰到的事cube(先前我们将cube的tag设置成了player)
if(other.transform.tag=="Player"){
//克隆一个火焰
fire=Instantiate(fires,other.transform.position,Quaternion.identity);
//设置火焰的父对象为箱子,这样火焰将和物体一起运动,
fire.transform.parent=other.transform;}
}

 五,你想加入声音嘛?如果你想,接着看两种方式添加音乐,首先添加背景音乐,点击摄像机,AddCommpent->aduio->aduiosource

 

首先 下载你需要的背景音乐,将音乐拖进Asset文件夹中,然后将音乐拖进刚才添加的aduiosource的中

然后 教你添加动作音效,在第一和代码中加入var music:AudioClip;

然后再发生子弹的那个方法中,AudioSource.PlayClipAtPoint(music,transform.position);播放,

六:挂载脚本

你首先将以第一个脚本,挂到摄像机上面,然后将第一个frefab(balls)拖到变量中

第二个脚本放在balls上,将fires和音乐拖到变量中!!

OK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 现在开火!!!!!!!!!

 

 

 

源码下载

2018-05-11 18:14:01 qq874455953 阅读数 3864
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

unity3d学习笔记(一) 第一人称视角实现和倒计时实现

1. 第一人称视角

(1)让mainCamera和player(视角对象)同步在一起

因为我们的player是生成的,所以不能把mainCamera直接放到预支对象里,所以我们实现的方法就是让player和camera的相对位置不变

创建脚本 CameraFlow.cs用于控制mainCamera移动,把此脚本挂到mainCamera中, 同时设置mainCamera为刚体,重力为零(不然mainCamera会掉), 而且把mainCamera和人物的头部放在一起(这里可以点击暂停,然后慢慢调整mainCamera位置)

下一步就是利用CameraFlow.cs使得mainCamera和人物相对位置不变

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraFlow : MonoBehaviour
{
    public GameObject follow;            //跟随的物体
    public float smothing = 5f;          //相机跟随的速度
    Vector3 offset;                      //相机与物体相对偏移位置

    void Start()
    {

        offset = new Vector3(0,1.9f,0.15f);


    }

    void FixedUpdate()
    {
        Vector3 target = follow.transform.position + offset;
        //摄像机自身位置到目标位置平滑过渡
        //transform.position = Vector3.Lerp(transform.position, target, smothing * Time.deltaTime);
        this.transform.position = target;
    }
}



(2)使鼠标控制方向

在mainCamera挂载mouseLook.cs脚本

using UnityEngine;
using System.Collections;

public class mouseLook : MonoBehaviour
{
    private IUserAction action;
    //方向灵敏度  
    public float sensitivityX = 0F;
    public float sensitivityY =0F;
    public float sensitive = 0.5f;

    //上下最大视角(Y视角)  
    public float minimumY = -60F;
    public float maximumY = 60F;

    float rotationY = 0F;

    void Update()
    {
        //根据鼠标移动的快慢(增量), 获得相机左右旋转的角度(处理X)  
        float rotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX;

        //根据鼠标移动的快慢(增量), 获得相机上下旋转的角度(处理Y)  
        rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
        //角度限制. rotationY小于min,返回min. 大于max,返回max. 否则返回value   
        rotationY = Mathf.Clamp(rotationY, minimumY, maximumY);

        //总体设置一下相机角度  
        transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);

        action.rotation(new Vector3(-rotationY, rotationX , 0) );
        //旋转player

    }

    void Start()
    {
        
        action = SSDirector.GetInstance().CurrentScenceController as IUserAction;
        // Make the rigid body not change rotation  
        //if (rigidbody)
        //    rigidbody.freezeRotation = true;
    }
}


这样就实现了第一人称, 同时你可以加入移动脚本

2.倒计时系统实现

首先加入一个定时器类Timer.cs

public class Timer

{

   bool _isTicking;//是否在计时中

   public float _currentTime;//当前时间

   public float _endTime;//结束时间

   public delegate void EventHander();
    


   public Timer(float second)

   {

       _currentTime = 0;

       _endTime = second;

   }

   /// <summary>

   /// 开始计时

   /// </summary>

   public void StartTimer()

   {

       _isTicking = true;

   }

   /// <summary>

   /// 更新中

   /// </summary>

   public void UpdateTimer(float deltaTime)

   {

       if (_isTicking)

       {

           _currentTime += deltaTime;

           if (_currentTime > _endTime)

           {

               _isTicking = false;


           }

       }

   }

   /// <summary>

   /// 停止计时

   /// </summary>

   public void StopTimer()

   {

       _isTicking = false;

   }

   /// <summary>

   /// 持续计时

   /// </summary>

   public void ContinueTimer()

   {

       _isTicking = true;

   }

   /// <summary>

   /// 重新计时

   /// </summary>

   public void ReStartTimer()

   {

       _isTicking = true;

       _currentTime = 0;

   }

   /// <summary>

   /// 重新设定计时器

   /// </summary>

   public void ResetEndTimer(float second)

   {

       _endTime = second;

   }

}

然后就可以调用类 来进行倒计时处理了

以下为测试代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UserGUI : MonoBehaviour {


    private Timer time;
   
    void Start ()
    {
      
        time = new Timer(60);
        time.StartTimer();
 
    }



    void Update()
    {
      
        time.UpdateTimer(Time.deltaTime);
        
    }
    private void OnGUI()
    {
      
        GUI.Label(new Rect(10, Screen.height - 50, 200, 50), "倒计时:")
        GUI.Label(new Rect(75, Screen.height - 50, 200, 50), (time._endTime - time._currentTime).ToString(), score_style);

    }
}


2017-02-26 11:58:30 jessssion 阅读数 7235
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

玩家的视口和移动

写在前面:
- 学习课本:Unity5实战 使用c#和unity开发多平台游戏-作者:Joseph Hocking
- 内容:第二章
- 下一篇:unity3d学习(二)制作第一人称射击-玩家射击和添加敌人


构建简单场景

第一步:在unity5中创建一个新场景,选择File|New Project。
第二步:利用unity自带的组件制作一个简单的场景,如下图:
简单场景
中间是一个胶囊(capsule),表示玩家。
第三步:设置玩家
1、把玩家(胶囊)的 碰撞检测器capsule collider移除,添加一个character controller(Inspector底部有个Add Component按钮)。
2、相玩家附加一个摄影机(camera)作为玩家的眼睛(可以把主摄影机直接拿来附加)。附加后建议摄影机设置的位置为0,0.5,0,重置rotation为0,0,0。

添加脚本

第一步:向玩家添加鼠标输入能观察四周的脚本
创建一个名为MouseLook脚本,代码如下:
using UnityEngine;
using System.Collections;

public class MouseLook : MonoBehaviour {
    //定义枚举数据结构,将名称和设置关联起来
    public enum RotationAxes
    {
        MouseXAndY = 0,
        MouseX = 1,
        MouseY = 2
    }
    public RotationAxes axes = RotationAxes.MouseXAndY;
    public float sensitivityHor = 9.0f;//水平旋转的速度
    public float sensitivityVert = 9.0f;//垂直旋转的速度
    public float minimumVert = -45.0f;//垂直旋转的最小角度
    public float maximumVert = 45.0f;//垂直旋转的最小角度

    private float _rotationX = 0;//为垂直角度声明一个私有变量

    void Start()
    {
        //将光标锁定到游戏窗口的中心。
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;
    }

    void Update ()
    {
        if (axes == RotationAxes.MouseX)
        {
            //水平旋转代码
            transform.Rotate(0,Input.GetAxis("Mouse X") * sensitivityHor, 0);
        }
        else if (axes == RotationAxes.MouseY)
        {
            //垂直旋转代码
            _rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;
            _rotationX = Mathf.Clamp(_rotationX,minimumVert,maximumVert);

            float rotationY = transform.localEulerAngles.y;//保持y轴与原来一样
            transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0);
        }
        else
        {
            //水平且垂直旋转
            _rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;
            _rotationX = Mathf.Clamp(_rotationX, minimumVert, maximumVert);//限制角度大小

            float delta = Input.GetAxis("Mouse X") * sensitivityHor;//设置水平旋转的变化量
            float rotationY = transform.localEulerAngles.y+delta;//原来的角度加上变化量
            transform.localEulerAngles = new Vector3(_rotationX,rotationY,0);//相对于全局坐标空间的角度
        }

        //当点击esc后
        if (Input.GetKeyDown("escape"))
        {
            Cursor.visible = true;
            Cursor.lockState = CursorLockMode.None;
            //Cursor.lockState = CursorLockMode.Confined;//将光标限制在游戏窗口。
        }
        if (Input.GetButtonDown("Fire1"))
        {
            Cursor.visible = false;
            Cursor.lockState = CursorLockMode.Locked;
        }
    }
}
第二步:给玩家和摄影机添加脚本
先把脚本挂到玩家身上可以选择玩家,设置Inspector面板axes枚举变量,看看三个状态下的不同效果。
如果选择MouseXAndY,发现玩家可以飞行。所有我们可以把玩家的axes值设置为MouseY,使它能够水平旋转,然后向摄影机添加一个MouseLook脚本,设置axes值设置为MouseX,使它垂直旋转。
第三步:创建玩家移动脚本 FPSInput
using UnityEngine;
using System.Collections;

[RequireComponent(typeof(CharacterController))]//RequireComponent表示此物体需要有 CharacterController才能运行此脚本,否则会报错
[AddComponentMenu("Control Script/FPS Input")]//AddComponentMenu表示脚本将在unity编辑器中添加组件菜单。以后想添加FPSInput脚本,可以在AddComponent中添加
public class FPSInput : MonoBehaviour {

    public float speed = 1f;
    public float gravity = -9.8f;

    private CharacterController _charController;

    void Start()
    {
        _charController = GetComponent<CharacterController>();
    }

    void Update ()
    {
        float deltaX = Input.GetAxis("Horizontal")*speed;
        float deltaZ = Input.GetAxis("Vertical") * speed;
        //transform.Translate(deltaX*Time.deltaTime, 0, deltaZ * Time.deltaTime);//此方法直接相对于本体移动

        Vector3 movement = new Vector3(deltaX,0, deltaZ);//此处是相对于本体的坐标
        movement = Vector3.ClampMagnitude(movement, speed);//限制向量的最大长度,并返回此变化后的向量
        movement.y = gravity;

        movement *= Time.deltaTime;
        movement = transform.TransformDirection(movement);//转换为世界坐标系

        _charController.Move(movement);//move()是现对与世界坐标系移动物体的。
    }
}
第四步:给玩家添加脚本,并且看看效果

总结

  • 1、Input.GetAxis(“Mouse X”):获取鼠标延左右移动的速度
  • 2、Input.GetAxis(“Mouse Y”):获取鼠标延上下移动的速度
  • 3、Input.GetKeyDown(“escape”):按下esc键
  • 4、transform.Rotate():使物体旋转,如果最后一个参数relativeTo默认以局部坐标旋转,如果设置为-Space.World(世界坐标系),则旋转应用于世界x,y,z轴。
  • 5、transform.localEulerAngles:物体的欧拉角(相对于父级的坐标),此例子我们直接改变物体的欧拉角以达到旋转的效果。和用transform.Rotate()改变有所区别
  • 6、Mathf.Clamp():
  • 7、Cursor.lockState = CursorLockMode.Locked;将光标锁定到游戏窗口的中心。
    Cursor.lockState = CursorLockMode.Confined;将光标限制在游戏窗口。
  • 8、Cursor.visible = false;隐藏光标
  • 9、CharacterController:CharacterController类。CharacterController允许你简单地做碰撞约束的移动,而不必处理刚体。
  • 10、CharacterController.Move():通过运动移动控制器,并且受碰撞约束,会延着碰撞体表面滑动,它不受重力影响。(相对于世界坐标系来移动物品)
  • 11、transform.TransformDirection():转换为世界坐标系
  • 12、Vector3.ClampMagnitude():限制一个向量的最大长度。

注意:很多类和方法不清楚请查看官方文档

2018-11-29 14:13:37 weixin_43435964 阅读数 517
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

贴上代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move : MonoBehaviour {

public float sensitivityHor = 9.0f;
public float sensitivityVer = 9.0f;
public float min = -45;   //竖直视角上旋转限制
public float max = 45;   //竖直视角上旋转限制
private float _rotationX = 0;  //竖直
private float _rotationY = 0;   //水平
private float delta; 
private float moveHor;//左右移动
private float moveVer;//前后移动
private void Update()
{
    _rotationX -= Input.GetAxis("Mouse Y") * sensitivityVer;   //注意是-=,这是获取竖直方向的向量
    _rotationX = Mathf.Clamp(_rotationX, min, max);  //添加限制
    delta = Input.GetAxis("Mouse X") * sensitivityHor;  //水平
    _rotationY = transform.localEulerAngles.y + delta;
    transform.localEulerAngles = new Vector3(_rotationX, _rotationY, 0);
    moveHor=input.getAxis("Horizontal");
    moveVer=input.getAxis("Vertical");
    transform.translate(moveHor,0.0f,moveVer,space.Self);
}

}

没有更多推荐了,返回首页