unity3d 平滑_unity3d平滑过渡 - CSDN
  • http://blog.csdn.net/u011285268/article/details/9229363
    展开全文
  • 转载地址:http://blog.csdn.net/nnsword/article/details/13060079unity3d 平滑看向的脚本,涉及到知识有二点间方向计算,三维向量的一些方法应用。以及四元素类的应用using UnityEngine; public class ...

    转载地址:http://blog.csdn.net/nnsword/article/details/13060079

    unity3d 平滑看向的脚本,涉及到知识有二点间方向计算,三维向量的一些方法应用。以及四元素类的应用

    using UnityEngine;
    public class SmoothLookFrame : MonoBehaviour
    {
    
        public Transform lookAtTarget;
        public Transform frameTarget;
        public float damping = 2.0f;
        public bool GoLookAtTarget = false;
        void Update()
        {
            if (GoLookAtTarget)
            {
                if (!lookAtTarget || !frameTarget)
                    return;
                Quaternion rotate = Quaternion.LookRotation(lookAtTarget.position - transform.position);
                transform.rotation = Quaternion.Slerp(transform.rotation, rotate, Time.deltaTime * damping);
            }
        }
    
        void DoLookAt()
        {
            GoLookAtTarget = true;
        }
    
        void CancelLookAt()
        {
            GoLookAtTarget = true;
        }
    }
    展开全文
  • 今天要实现的功能是利用WASD或是方向键实现人物平滑转身。  1.首先搭建一个简易的场景和人物,我在这里利用一个圆柱加一个cube代表人物,其次保证人物模型的本地坐标与世界坐标保持统一,如图所示 2.在人物...

           今天要实现的功能是利用WASD或是方向键实现人物平滑转身。

           1.首先搭建一个简易的场景和人物,我在这里利用一个圆柱加一个cube代表人物,其次保证人物模型的本地坐标与世界坐标保持统一,如图所示


    2.在人物身上添加PlayerController脚本,源码如下:

    using UnityEngine;
    using System.Collections;
    
    public class PlayerController : MonoBehaviour {
    	float ver = 0;
    	float hor = 0;
    	public float  turnspeed = 10;
    
    	// Use this for initialization
    	void Start () {
    		
    	}
    	
    	// Update is called once per frame
    	void Update () {
    		hor = Input.GetAxis("Horizontal");
    		ver = Input.GetAxis("Vertical");
    
    	}
    	void Rotating (float hor, float ver)
    	{
    		//获取方向
    		Vector3 dir = new Vector3 (hor,0,ver);
    		//将方向转换为四元数
    		Quaternion quaDir = Quaternion.LookRotation(dir,Vector3.up);
    		//缓慢转动到目标点
    		transform.rotation = Quaternion.Lerp(transform.rotation,quaDir,Time.fixedDeltaTime*turnspeed);
    		
    
    
    	}
    
    	void FixedUpdate(){
    
    
    		if(hor!= 0 ||ver!= 0 ){
    			//转身
    			Rotating(hor,ver);
    		
    		
    
    	}
    }
    
    }






    展开全文
  • 并且要平滑转身,这篇文章就算是角色行为的进阶教程吧,我们来实现上述要求,我的脚本都是用C#写的,本来就一直是C++程序员,看着这个舒服一些。 先让我们锁定视角吧,这个相对简单一些: 打开之前加

    本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢。

    http://blog.csdn.net/lzhq1982/article/details/12583093


    上一篇文章介绍了怎样加入我们的主角,并实现其简单的动作行为,但有几点我不满意,首先是我需要固定视角,尤其是做移动上的游戏,让场景随着角色转来转去的会让玩家晕的,然后是我希望鼠标控制主角奔跑,点到哪跑到哪,并且要平滑转身,这篇文章就算是角色行为的进阶教程吧,我们来实现上述要求,我的脚本都是用C#写的,本来就一直是C++程序员,看着这个舒服一些。

    先让我们锁定视角吧,这个相对简单一些:

    打开之前加的ThirdPersonCamera脚本,找到Apply这个函数,它会在LateUpdate里每帧执行一次,主要的核心功能都是在这里实现的,我们要固定视角,就是当角色转身的时候摄像机不转,所以找到摄像机旋转的地方:

    var currentRotation = Quaternion.Euler (0, currentAngle, 0);

    currentAngle会随着角色的方向而变化,最后换算成欧拉角计算到摄像机的位移中,

    cameraTransform.position += currentRotation * Vector3.back * distance;
    所以我们要固定这个currentAngle就可以了,我加了个硬代码,把currentAngle换成了3.7459,请大家不要喷我,方法简单有效。

    var currentRotation = Quaternion.Euler (0, 3.7459, 0);

    ok,再运行一下试试吧,我们终于不用总盯着美眉的后背看了。


    下面让我们自定义控制脚本吧,先废弃掉ThirdPersonController,很简单,把脚本前面的勾去掉就可以了。

    首先创建一个脚本,我命名为Hero,先枚举几种角色状态

    private enum en_state
    	{
    		en_state_none,
    		en_state_idel,
    		en_state_walk,
    		en_state_run,
    		en_state_attack,
    		en_state_hurt,
    		en_state_skill,
    		en_state_die
    	};

    然后声明当前状态:en_state curState;

    在start()里,定义 curState = en_state_idel;

    然后在Update里,分别处理各种状态:

    switch (curState)
    		{
    		case en_state.en_state_none:
    			break;
    		case en_state.en_state_idel:
    			curAnimClip = animation["Idle"].clip;
    			gameObject.animation.CrossFade(curAnimClip.name);
    			transform.Translate(Vector3.zero);
    			break;
    		case en_state.en_state_walk:
    			break;
    		case en_state.en_state_run:
    			curAnimClip = animation["Run"].clip;
    			gameObject.animation.CrossFade(curAnimClip.name);
    			Vector3 forward = transform.TransformDirection(Vector3.forward);
    			_controller.SimpleMove(forward * runSpeed);
    			
    			if (runTarget != Vector3.zero) {				
    				smoothRotate(runTarget);				
    				if (Mathf.Abs(Vector3.Distance(transform.position, runTarget)) <= 1.3f) {
    					runTarget = Vector3.zero;
    					curState = en_state.en_state_idel;
    				}
    			}
    			break;
    		case en_state.en_state_skill:
    			playEffect();
    			break;
    		case en_state.en_state_attack:
    			break;
    		case en_state.en_state_die:
    			animation.CrossFade("Death");
    			transform.Translate(Vector3.zero);
    			curState = en_state.en_state_none;
    			break;
    		}

    因为本篇只讲鼠标控制奔跑和休息,所以只看idel和run就可以了。代码很简单,其中 curAnimClip是之前声明的 AnimationClip curAnimClip,用来记录动作片段。_controller是CharacterController变量,_controller = GetComponent<CharacterController>(); 用来获取角色控制器组件。runTarget是角色要去的目标点,也就是你鼠标点击的点。好了,状态机都在这里了,让我们看看角色是怎么跑的,在update里,我加了一个runByMouse()函数,用来判断是否有鼠标点击事件产生,如果有,则置角色奔跑的目标点,并处理奔跑行为,代码如下:

    void runByMouse()
    	{
    		if (Input.GetMouseButton(0)) {
    			Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    			RaycastHit hit;
    			if (Physics.Raycast(ray, out hit)) {
    				if (hit.collider.gameObject.name == "Terrain") {
    					runTarget = hit.point;
    					curState = en_state.en_state_run;
    				}
    			}
    		}
    	}

    原理很简单,从摄像机到你点击屏幕的点发出一条射线,当射线与地面碰撞时,碰撞的点即为目标点,然后重置奔跑状态,角色会在状态机中处理奔跑。这里一定要判断碰撞点是否是地面,因为射线在碰撞到地面之前很可能会有其他碰撞,尤其是当你有界面时,射线会先碰撞到界面上,如果你不想点个界面按钮角色都要奔跑,那在判断射线与地面碰撞之前你就该拦截到,这部分讲到UI时再说。

    好,再看回状态机中处理奔跑那段

    case en_state.en_state_run:
    			curAnimClip = animation["Run"].clip;
    			gameObject.animation.CrossFade(curAnimClip.name);
    			Vector3 forward = transform.TransformDirection(Vector3.forward);
    			_controller.SimpleMove(forward * runSpeed);
    			
    			if (runTarget != Vector3.zero) {				
    				smoothRotate(runTarget);				
    				if (Mathf.Abs(Vector3.Distance(transform.position, runTarget)) <= 1.3f) {
    					runTarget = Vector3.zero;
    					curState = en_state.en_state_idel;
    				}
    			}
    			break;
    我这里先是处理奔跑动画,然后用CharacterController的simplemove处理位移,处理位移有多种方式,最简单的是translate,但这种方式只适合处理平面位移,要是遇到高低不平的地面就悲剧了,当然,如果你的地面是平的,这种方式是最优的。然后CharacterController有两种位移函数,一种是move,一种是simplemove,看了一下官方的接口说明,move是绝对位移,并且不会施加任何重力,所以你要用move就需要它与Time.deltaTime联合得到每帧的位移,并且要自己实现重力,而simplemove相对简单一些,相对位移,只需要与速度挂钩就可以了,它自动施加重力。接着说程序,下面判断是否跑到了目标点,如果没跑到,smoothRotate是用来处理平滑转身的,如果角色的位置与目标点小于一定值时,则达到目标点,并重置休息状态。下面看看smoothRotate平滑转身的代码。

    void smoothRotate(Vector3 target)
    	{
    		if (lastRunTarget != target) {
    			lastRunTarget = target;
    			rotateT = 0.0f;
    		}
    		Vector3 tempVec = target;
    		tempVec.y = transform.position.y;
    		Vector3 relativePos = tempVec - transform.position;
    		Quaternion rotation = Quaternion.LookRotation(relativePos);
    		rotateT = 500 / Quaternion.Angle(transform.rotation, rotation) * Time.deltaTime;
    		if (rotateT >= 1.0f) {
    			rotateT = 1.0f;
    			transform.rotation = rotation;
    		} else
    			transform.rotation = Quaternion.Slerp(transform.rotation, rotation, rotateT);
    	}
    先判断是否是上一次的目标点,如果不是,重置rotateT,获得目标点的向量,y值要用当前点的y值,这样不会有y方向的分量,旋转公式是个重点,我是以每秒500度的转速旋转的,总共要转Quaternion.Angle(transform.rotation, rotation)这些角度,那么在deltaTime时间内,转过了多少比例呢,当这个值大于等于100%,也就是1,那就转到了,否则按照这个差值用Quaternion的Slerp函数平滑旋转吧,对于这个slerp函数,百度了很长时间,我个人理解第三个参数更像是比例,范围是[0,1]。也可以用别的方式实现,我经过多种测试,还是觉得这种方法转速更均匀。

    到现在还有一个问题,就是一进入游戏发现角色停在空中,没有重力,除非跑动会施加重力,那好吧,我给她个重力。

    if (!_controller.isGrounded) {
    			_verticalSpeed -= _gravity * Time.deltaTime;
    			Vector3 moveMent = new Vector3(0, _verticalSpeed, 0);
    			_controller.Move(moveMent);
    		}

    加在update里就好了,这里用到了CharacterController的Move,可以和上面的SimpleMove对比一下。原理很简单,先判断是否在地上,不在,就不断减少y方向的坐标值,使其加速下落,_gravity是变量,我设置为1,值越大下落越快。

    好了,基本功能都实现了,如果你想键盘鼠标都对角色产生效果,那你还要操点心,当鼠标操控时,你要拦截掉ThirdPersonController的update,不然你会发现很奇葩的现象,因为ThirdPersonController的update里可没有考虑你的行为。有兴趣的自己实现吧。


    展开全文
  • unity3d 平滑切换视角

    2018-01-19 00:31:34
    实现从A到B的平滑视角切换(第三人称视角 和 射击视角 的切换) public class PlayerShooting : MonoBehaviour { private float CD = 0.5f; private float atTime = 0; // 将要到达的时间 Animator animator; ...
  • Unity3D 平滑转向

    2019-07-17 06:31:39
    Quaternion rotate = Quaternion.LookRotation(目标.position - transform.position); transform.rotation = Quaternion.Slerp(transform.rotation, rotate, Time.deltaTime * 旋转速度); ...
  • 游戏中经常遇到转向的问题,比如遥感控制角色旋转一定角度。写成工具类,记录一下,随用随粘。方法如下: public void Rotate(Transform transform,float horizontal , float vertical , float fRotateSpeed) ...
  • #pragma strict var cam01:GameObject; var cam01Pos:GameObject; var cam02Pos:GameObject; // 用于判断摄像机是否在移动 var isMoving:boolean = false; var dx:float = 0; var dy:float = 0;...func
  • 很多时候我们需要的并不是直线和折线,而是平滑的曲线,比如寻路系统,某些物体的曲线运动,都需要平滑曲线来保证效果,今天试了一下,通过iTweenPath利用的贝赛尔曲线可以很好的实现平滑曲线,下面上图,上资料,上链接,老...
  • public Transform target = null;   public float height = 1f;   public float positionDamping = 3f;   public float velocityDamping = 3f;... public float distance = 4f;...
  • using UnityEngine; using System.Collections;public class SmoothFollowerObj {private Vector3 targetPosition; private Vector3 position; private Vector3 velocity; private float smoothingTime;...
  • public class BucketController : MonoBehaviour { public Obi.ObiEmitter emitter; // Update is called once per frame void Update () { //旋转碗口 if (Input.GetKey(KeyCode.D)){ ...
  • unity关于lineRender平滑画线问题_unity3d5.3.6源码.zip
  • 游戏制作过程中控制物体移动是很常见的功能 但是有时候在用的时候总不能很快的用到合适的方法,现在总结下所有的移动方法(这里的运动都是指平滑运动不包含瞬间移动) 移动物体分为两种方式:1.非物理移动(没有力...
  • Unity3D】使物体平滑旋转一定角度 using System.Collections; using System.Collections.Generic; using UnityEngine; /* 90度平滑转动 * 由点击触发 * 转动所需时间为t * 则转动所需要的帧数为fps*t * 每一...
  • unity 3d动画平滑启停

    2015-01-25 22:11:57
    编程中总会遇到一些纠结的问题,在网上也总能找到一些解决办法...转自:http://ilaoxu.com/common-problem-in-the-unity-animation-animation.html 1.停止动画 停止动画的脚本:animation.Stop(); 2.播放动画
  • 直接贴代码了 using UnityEngine; using System; using System.Collections; using System; using DataTable; public class ObjDropItem : ObjBase { ... public override OBJ.TYPE GetObjType() { r...
  • Unity中物体的抛物线轨迹简单实现。欢迎大家交流。
  • 我这个摄像机是跟随角色,且角色朝向某个方向,镜头也会做相应的调整,我看网上大部分估计66%左右只是设置镜头和角色之间的offset,并没有考虑角色可能一直在寻找敌人,攻击敌人或者跑向敌人的时候,他们没有去考虑...
  • https://kylewbanks.com/blog/unity-make-camera-follow-player-smoothly-and-fluidly Unity: Make the Camera Follow a Player (or any GameObject) ...Unity中实现相机平滑且流畅的跟随玩家(或其他对象)
1 2 3 4 5 ... 20
收藏数 4,096
精华内容 1,638
关键字:

unity3d 平滑